【发布时间】:2025-11-30 05:05:02
【问题描述】:
以下是在 Java 中使用 AES 加密的摘录:
encryptedData = encryptCipher.doFinal(strToEncrypt.getBytes());
以下是c#中的摘录
DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);
两者都使用一个字节数组加密另一个解密,Java中的加密会产生一些存储在字节数组中的负值。
C# 使用字节数组进行解密,但 C# 中的字节被定义为仅包含 0..255 之间的数字 - Java 将其字节类型定义为 -128 到 127。
因此,我无法将加密数据发送到用 C# 编写的远程应用程序,因为它无法使用从 Java 应用程序发送的字节数组进行解密。
有没有人想出一个解决方案,让我告诉 java 在加密时不要产生负数?
代码来自 Micrsoft,MemoryStream 需要 byte[] 来为加密代码创建流... 不管有没有提到,我用 sbyte 替换了 byte[] 但无济于事,因为 MemoryStream 需要 byte[]
static string DecryptStringFromBytes_Aes(sbyte[] cipherText, byte[] Key, byte[] IV)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("Key");
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
// Create an Aes object
// with the specified key and IV.
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream((byte)cipherText))
{
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.
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
【问题讨论】: