【发布时间】:2026-01-13 11:35:01
【问题描述】:
所以我终于发现在为具有相同加密的 .Net Wcf 服务实施 AES 128 加密时有些不太稳定。我现在的问题是,每当它尝试解密字符串时,它都会执行一个 FromBase64String 转换的步骤,这会给我一个错误:
static public string DecryptString(string message, string key)
{
string output = "";
Rijndael aes = new RijndaelManaged();
try
{
byte[] encrypted = Convert.FromBase64String(message);
byte[] cipherText = GetCipherText(encrypted);
aes.Key = Convert.FromBase64String(key);
aes.Mode = CipherMode.CBC;
aes.IV = GetIV(encrypted);
using (MemoryStream ms = new MemoryStream())
{
using (ICryptoTransform decryptor = aes.CreateDecryptor())
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
{
cs.Write(cipherText, 0, cipherText.Length);
cs.FlushFinalBlock();
byte[] decrypted = ms.ToArray();
output = Encoding.UTF8.GetString(decrypted);
}
}
}
}
错误是:
索引超出了数组的范围。
它发生在
cs.FlushFinalBlock();
这是它为消息“heythere”和密钥“25f9e794323b453885f5181f1b624d0b”生成的加密
0suql40BUGiDoFA4SdXJAA==
这来自我的 .Net 加密:
unNWQfm9RaU/HgKlDNEmoXZaTzsuBoTNsA2UvDKZhc4=
PS 对于 AES 128 的 iPhone 加密,我从以下位置获取代码:
【问题讨论】:
-
iPhone代码在哪里?您引用的问题没有它(问题中的链接指向一个空白页面)。我注意到的一件事是您使用加密文本作为 IV;这几乎肯定是错误的。
-
另外,AES 是 Rijndael 的“专用”版本。您需要确保设置正确的密钥大小和填充(
KeySize = 256; BlockSize = 128; Mode = CipherMode.CBC; Padding = PaddingMode.PKCS7) -
@gdubs:你的代码可能会让一些人感到惊讶。至少在正确的大括号中完成它会有助于提高可读性。
-
我没有看到任何 Objective-C。为什么这个问题被标记为这样?
-
错误不可重现。请提供正确的最小工作示例。
标签: c# objective-c base64 aes