当我尝试将代码形式从Java转换为C#时,EncryptFunction存在一个大问题。 我在Java中有以下代码:
private String KEY_PRIVATE_HP = "__hpcSecretKey__";
private IvParameterSpec getIvParameterSpec() {
byte[] empty = new byte[16];
return new IvParameterSpec(empty);
}
private String encryptBin(String value) {
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY_PRIVATE_HP.getBytes("UTF-8"),"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, getIvParameterSpec());
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}
然后我将其转换为C#:
static string KEY_PRIVATE_HP = "__hpcSecretKey__";
public static string encryptBin(string value)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = 0x80;
rijndaelCipher.BlockSize = 0x80;
byte[] pwdBytes = Encoding.UTF8.GetBytes(KEY_PRIVATE_HP);
byte[] keyBytes = new byte[0x10];
int len = pwdBytes.Length;
if (len > keyBytes.Length)
{
len = keyBytes.Length;
}
Array.Copy(pwdBytes, keyBytes, len);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = keyBytes;
ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
byte[] plainText = Encoding.UTF8.GetBytes(value);
return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
}
但是当我一起使用C#和Java进行调试时,结果会有所不同。 怎么了?
答案 0 :(得分:3)
在一个代码中,您使用全零字节IV,在另一个代码中,您复制密钥字节。
两者都不安全,对于CBC模式,IV应该是不可预测的。通常会使用安全的随机值,并以密文作为前缀。
您可能想看看认证密码,例如GCM。在两个程序之间使用CBC来确保运输安全是不安全的。