我有一个示例Java函数,想为PHP做一个模拟:
public static string Encrypt(string plainText, string key)
{
byte[] byteKey = new ASCIIEncoding().GetBytes(key);
MemoryStream mStream = new MemoryStream();
// Create a CryptoStream using the MemoryStream
// and the passed key and initialization vector (IV).
CryptoStream cStream = new CryptoStream(mStream,
new TripleDESCryptoServiceProvider().CreateEncryptor(byteKey, byteKey),
CryptoStreamMode.Write);
// Convert the passed string to a byte array.
byte[] toEncrypt = new ASCIIEncoding().GetBytes(plainText);
// Write the byte array to the crypto stream and flush it.
cStream.Write(toEncrypt, 0, toEncrypt.Length);
cStream.FlushFinalBlock();
// Get an array of bytes from the
// MemoryStream that holds the
// encrypted data.
byte[] ret = mStream.ToArray();
// Close the streams.
cStream.Close();
mStream.Close();
return Convert.ToBase64String(ret);
}
这是我的PHP函数,但它没有给我确切的结果:
function Encrypt($data, $secret)
{
//Generate a key from a hash
$key = md5(utf8_encode($secret), true);
//Take first 8 bytes of $key and append them to the end of $key.
$key .= substr($key, 0, 8);
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
return base64_encode($encData);
}
我正在尝试加密的字符串是:
Java生成的字符串:i00KAKI7U0L7fyvrEnDdB7DtaJNO1HuwRh0 / J5aWnCQ =
PHP生成的字符串:6065L3jC5Oji8NAVzipA4OZZ102j1zFd / KfLgAdnRX0 =
非常感谢任何帮助
答案 0 :(得分:1)
似乎没有以相同的方式使用密码。 在您的Java代码中,您使用IV进行加密,而在PHP代码中却没有这样做。 这是因为ECB,你在PHP代码中指定的模式,不需要任何初始化,而你在Java中使用的模式都是如此。
您使用的是哪个库? 正如here中所述的Microsoft库的引用,very similar与您使用Java的库一样,默认加密模式是 CBC(通常被认为比欧洲央行更安全)。 CBC很可能也在您的图书馆中使用。
如果您想要相同的结果,则需要使用相同的加密模式。因此,要么在PHP代码中设置CBC(以及在Java中使用的相同IV),要么使用TripleDESCryptoServiceProvider
在Java中设置ECB模式。