2017-08-02 145 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您的親切幫助,我真的很感激。 –