结果不同加密C#Java

时间:2019-01-03 12:01:54

标签: java c# encryption

当我尝试将代码形式从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进行调试时,结果会有所不同。 怎么了?

1 个答案:

答案 0 :(得分:3)

在一个代码中,您使用全零字节IV,在另一个代码中,您复制密钥字节。

两者都不安全,对于CBC模式,IV应该是不可预测的。通常会使用安全的随机值,并以密文作为前缀。

您可能想看看认证密码,例如GCM。在两个程序之间使用CBC来确保运输安全是不安全的。