2010-07-13 74 views
5

我必须将一些字符串从一个java servlet传递给一个php脚本。有什么选择来加密字符串?我需要一个为java和php实现的方法(如..凯撒密码...)。有没有任何标准的加密方法,我应该能够得到一个库和Java和PHP?为php和java实现的加密方法?

我想加密java端的字符串,传递给php脚本,然后让php脚本解密它们。

由于我使用的提供商的限制,我无法使用https。

感谢

回答

14

希望这可以让你开始。错误处理丢失,秘密密钥被硬编码。这些都需要解决生产质量代码。从Java端,你可以使用Java Cryptography Architecture (JCA)

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 
import javax.xml.bind.DatatypeConverter; 

public final void testTesting() throws Exception { 
    final String plainText = "plain text"; 
    final String result = encrypt(plainText); 
    System.out.println(result); 
} 

public String encrypt(final String plainText) throws Exception { 
    final byte[] data = plainText.getBytes("UTF-8"); 
    final byte[] encoded = encrypt(data); 
    final String result = new String(encoded); 
    return result; 
} 

public byte[] encrypt(final byte[] data) throws Exception { 
    // this is just an example key, real code should use a properly generated shared secret 
    final byte[] secret = new byte[] {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}; 
    final SecretKeySpec key = new SecretKeySpec(secret, "AES"); 

    final Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    encryptCipher.init(Cipher.ENCRYPT_MODE, key); 
    final byte[] iv = encryptCipher.getIV(); 
    final byte[] encrypted = encryptCipher.doFinal(data); 

    final int outputLength = encrypted.length; 
    final int ivLength = iv.length; 

    final byte[] results = new byte[outputLength + ivLength]; 
    System.arraycopy(iv, 0, results, 0, ivLength); 
    System.arraycopy(encrypted, 0, results, ivLength, outputLength); 

    return DatatypeConverter.printBase64Binary(encoded); 
} 

从PHP端,你将需要Mcrypt

<?php 
$key = base64_decode('KioqKioqKioqKioqKioqKg=='); 
$input = base64_decode($_GET['input']); 
$plain_text = substr($input, 16); 
$initialization_vector = substr($input, 0, 16); 
echo pkcs5_unpad(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $plain_text, MCRYPT_MODE_CBC, $initialization_vector)); 

function pkcs5_unpad($text) { 
    $pad = ord($text{strlen($text)-1}); 
    if ($pad > strlen($text)) { 
     return false; 
    } 
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) { 
     return false; 
    } 
    return substr($text, 0, -1 * $pad); 
} 
?> 

功能pkcs5_unpad,因为它似乎PHP这个Mcrypt不包括PKCS5填充载体从here复制。 Java代码使用用于加密它的初始化向量为数据添加前缀。随后,PHP代码将其分成两部分,即初始化向量和加密数据。

此代码在CBC模式下使用128位AESRijndael),该模式对于大多数用途应该足够安全。除了简单的加密之外,我推荐使用HMAC,如here所述,以确保数据不被篡改。要在Java中执行HMAC,请使用Mac类。对于PHP,请参见Mhash

+0

哇,这正是我所需要的。我会试一试,谢谢你设置所有这些,会报告回来。 – user246114 2010-07-13 05:48:31

0

看看mcrypt扩展名为PHP。其中之一几乎可以肯定存在于Java中。

0

大多数标准加密算法都可以在PHP和Java中使用。

看一看:

正如你可以看到,他们都支持DES,的TripleDES,RC2在最少。