AES256 JAVA加密与C#加密不匹配

时间:2017-08-02 13:34:02

标签: c# encryption aes

在与我的合作伙伴的JAVA API交谈时,我被要求加密一些数据,他向我发送了有关加密算法的以下详细信息:

  • 算法:AES256
  • 密钥大小:256位
  • 加密模式:CBC(16位块,PKCS5Padding为0)
  • 输出类型:Base-64
  • 密码:0xA8703827AE586460105696504327B7BB0806FEAE96BD664F89E36868FBB48E3D
  • IV :是一个带有0值的字节[16]

我使用了以下代码,但我没有得到与他匹配的结果:

public byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
{
    byte[] encryptedBytes = null;
    byte[] saltBytes = new byte[16] { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

    using (MemoryStream ms = new MemoryStream())
    {
        using (RijndaelManaged aes = new RijndaelManaged())
        {
            aes.KeySize = 256;
            aes.BlockSize = 128;

            var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
            aes.Key = key.GetBytes(aes.KeySize / 8);
            aes.IV = key.GetBytes(aes.BlockSize / 8);
            aes.Padding = PaddingMode.PKCS7;

            aes.Mode = CipherMode.CBC;

            using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                cs.Close();
            }
            encryptedBytes = ms.ToArray();
        }
    }

    return encryptedBytes;
}


public string EncryptText(string input, string password)
{
    byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);
    byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

    passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

    byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);

    string result = Convert.ToBase64String(bytesEncrypted);

    return result;
}

所以,当我们尝试加密你好,你好吗?时,我得到了不同的结果,我应该得到相同的结果,因为他将解密我在他身边发送的数据,并将处理它。给定的示例应该具有以下结果:TJTojNoVgoqnhCj4uTv1jLBiZU7r+s/0Bm234bHU+S0=

1 个答案:

答案 0 :(得分:2)

我做了一些测试,现在能够匹配您的预期结果。

要完成2项更改。

<强> IV

IV是最简单的,正如你所说的IV = 0,所以将IV设置如下:

aes.IV = new byte[16];

在AES中,IV is 16 bytes。上面将创建一个16字节的字节数组,每个值初始化为零。

<强>关键

您给出的密码以“0x”开头 - 这实际上意味着这是密码字符串的十六进制表示。我使用this

将此密码转换为字节数组
string password = "A8703827AE586460105696504327B7BB0806FEAE96BD664F89E36868FBB48E3D";

请注意我从上面的

中删除了起始“0x”
byte[] passwordBytes = StringToByteArray(password);

上面将十六进制密码表示转换为字节数组。

AES_Encrypt方法中,直接将此字节[]指定为键

aes.Key = passwordBytes;

现在,我的结果是TJTojNoVgoqnhCj4uTv1jLBiZU7r+s/0Bm234bHU+S0=,它与您的预期输出完全匹配。