2017-08-02 186 views
1

我已要求加密一些数据,他送我以下细节有关加密算法:AES256 JAVA加密不匹配,C#加密

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

我用下面的代码,但是我没有得到与他匹配的结果:

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=

+3

您需要提供java代码才能找出他们不同意的原因。 –

+0

客户端提到[this](https://dzone.com/articles/aes-256-encryption-java-and),如果你找不到这个就够了,请让我知道问他更多的信息 –

+1

正如你可以清楚地看到你自己这是你的代码和代码之间的巨大差异,特别是在密钥和IV的推导中。 –

回答

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=这正好与预期输出匹配。

+0

感谢Subbu为您提供的帮助,但在您提到的修改后,我没有得到相同的结果。你可以在修改后找到新的代码下载[这里](https://www.dropbox.com/s/m9f7jqiauk5ne0h/Class1.cs?dl=0)。我非常感谢你的支持。 –

+1

从您的代码中删除此行'passwordBytes = SHA256.Create()。ComputeHash(passwordBytes);' – Subbu

+0

WOW!它现在可以正常工作,我会在下周与他们联系,以确保一切正常。另一方面,非常感谢Subbu您的亲切帮助,我真的很感激。 –