Расшифровка зашифрованной строки AES в C#
Я пытаюсь расшифровать зашифрованную строку AES из Java, в C#. Когда я расшифровываю, он возвращает бессмысленный текст и не соответствует исходному тексту, который был зашифрован с помощью кода Java. Просьба направить меня на то, что здесь происходит не так.
Прикрепленный код Java для шифрования и код C# для расшифровки. Пожалуйста, дайте мне знать, если вам нужно больше деталей.
Я пробовал AesCryptoServiceProvider, но он тоже не работал. Вы можете увидеть пробный код в закомментированном коде в C#.
Пожалуйста, обратите внимание, что я могу вносить изменения в мой код C# только в соответствии с кодом Java и не могу вносить изменения в сторону Java.
Java-код для шифрования:
/** encrypt cipher */
private static final Cipher ENCRYPT_CIPHER = generateCipher(Cipher.ENCRYPT_MODE);
private static String ENCRYPT_KEY = "key";
/**
* @param val
* @return encrypted value
* @throws Exception
*/
public String encrypt(final String val) throws Exception {
return new String(Base64.encodeBase64(ENCRYPT_CIPHER.doFinal(val.getBytes()), true)).toString();
}
/**
* @param encrypt
* @return cipher
*/
protected static Cipher generateCipher(final int encrypt) {
try {
final Cipher cipher = Cipher.getInstance("AES");
cipher.init(encrypt, SecretKeyFactory.getInstance("AES").generateSecret(new IBMAESKeySpec(Base64.decodeBase64(ENCRYPT_KEY.getBytes()))));
return cipher;
} catch (final Exception e) {
return null;
}
}
Код C# для расшифровки:
private static String ENCRYPT_KEY = "key";
public String decodeString (String encodedStr)
{
/*using (var aesCryptoProvider = new AesCryptoServiceProvider())
{
aesCryptoProvider.BlockSize = 128;
aesCryptoProvider.KeySize = 256;
aesCryptoProvider.Key = Convert.FromBase64String(ENCRYPT_KEY.ToString());
aesCryptoProvider.Padding = PaddingMode.Zeros;
aesCryptoProvider.Mode = CipherMode.ECB;
using (var decryptor = aesCryptoProvider.CreateDecryptor())
using (var memoryStream = new MemoryStream(Convert.FromBase64String(encodedStr)))
using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
using (var streamReader = new StreamReader(cryptoStream, Encoding.UTF8))
{
decodedStr = streamReader.ReadToEnd();
}
}
*/
using (AesManaged aesAlg = new AesManaged())
{
aesAlg.Key = Convert.FromBase64String(ENCRYPT_KEY.ToString()); ;
aesAlg.BlockSize = 128;
aesAlg.KeySize = 256;
aesAlg.Mode = CipherMode.ECB;
aesAlg.Padding = PaddingMode.Zeros;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = aesAlg.CreateDecryptor();
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(encodedStr)))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
decodedStr = srDecrypt.ReadToEnd();
}
}
}
}
}
1 ответ
Это просто быстрый ответ. Вы не провели тонны исследований, но вы проверили, соответствует ли порядковый номер последовательности? Похоже, что C# (.NET) имеет порядок байтов, но JVM имеет порядок байтов. Однако я не уверен, что он поменяет его для передачи по сети (тогда он будет соответствовать аппаратному обеспечению). Просто идея. Если я найду что-нибудь дополнительное, я обновлю свой ответ.