2017-08-02 3 views
1

I angefordert wurde einige Daten zu verschlüsseln, während meines Partners JAVA API sprechen, und er schickte mir die folgenden Details über Verschlüsselungsalgorithmus:AES256 JAVA-Verschlüsselung nicht mit C# Verschlüsselung

  • Algorithmus: AES256
  • Schlüsselgröße: 256 Bits
  • Verschlüsselungsmodus: CBC (16 Bit-Blöcke, PKCS5Padding mit 0)
  • Ausgabetyp: Base-64
  • Passwort: 0xA8703827AE586460105696504327B7BB0806FEAE96BD664F89E36868FBB48E3D
  • IV: ein Byte [16] mit 0 Werten

verwendete ich den Code unten, aber ich habe nicht bekommen ein angepasstes Ergebnis mit ihm:

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; 
} 

wenn wir also zu verschlüsseln versuchen Hallo , Wie geht es Ihnen?, ich habe ein anderes Ergebnis bekommen und ich sollte das gleiche Ergebnis bekommen, das er hatte, da er meine gesendeten Daten auf seiner Seite entschlüsseln und verarbeiten wird. Das angegebene Beispiel sollte dieses Ergebnis haben: TJTojNoVgoqnhCj4uTv1jLBiZU7r+s/0Bm234bHU+S0=

+3

Sie müssten den Java-Code angeben, um herauszufinden, warum sie nicht einverstanden sind. –

+0

Der Kunde bezieht sich auf [dies] (https://dzone.com/articles/aes-256-encryption-java-and), wenn Sie nicht genug genug finden, lassen Sie mich bitte wissen, um ihn für weitere Informationen zu fragen –

+1

Wie Sie sich selbst sehen können, sind dies große Unterschiede zwischen Ihrem Code und diesem Code, insbesondere bei der Ableitung des Schlüssels und der IV. –

Antwort

2

Ich habe ein paar Tests gemacht und jetzt in der Lage, Ihr erwartetes Ergebnis zu erreichen.

2 Änderungen durchgeführt werden.

IV

IV ist die einfachste, wie man IV sagte = 0, so eingestellt IV wie folgt:

aes.IV = new byte[16]; 

In AES, IV is 16 bytes. Das obige würde ein Byte-Array von 16 Bytes erzeugen, wobei jeder Wert auf Null initialisiert wird.

Key

Das Passwort, das Sie beginnt mit „0x“ gegeben hat - das bedeutet im Wesentlichen, dass diese hexadezimale Darstellung des Passwort-String ist. Ich konvertierte dieses Passwort Array Byte mit this

string password = "A8703827AE586460105696504327B7BB0806FEAE96BD664F89E36868FBB48E3D"; 

Bitte beachten Sie, ich den Start „0x“ aus den obigen

byte[] passwordBytes = StringToByteArray(password); 

Die oben wandelt die hexadezimale Darstellung Passwort in einem Byte-Array entfernt.

In Ihrer AES_Encrypt Methode, direkt auf diesen Byte zuordnen [] als Schlüssel

aes.Key = passwordBytes; 

Nun ist mein Ergebnis TJTojNoVgoqnhCj4uTv1jLBiZU7r+s/0Bm234bHU+S0=, die genau mit Ihrer erwarteten Ausgabe übereinstimmt.

+0

Danke Subbu für Ihre freundliche Hilfe, aber ich habe nicht das gleiche Ergebnis nach den Änderungen erhalten, die Sie erwähnt haben. Sie finden den neuen Code nach der Änderung zum Herunterladen [hier] (https://www.dropbox.com/s/m9f7jqiauk5ne0h/Class1.cs?dl=0). Ich bin wirklich dankbar für deine Unterstützung. –

+1

entfernen Sie diese Zeile aus Ihrem Code 'passwordBytes = SHA256.Create(). ComputeHash (passwordBytes);' – Subbu

+0

WOW! es funktioniert jetzt richtig, ich werde sie nächste Woche kontaktieren, um sicherzustellen, dass alles gut funktioniert. Auf der anderen Seite, vielen Dank Subbu für Ihre freundliche Hilfe, ich schätze das wirklich. –

Verwandte Themen