【问题标题】:objective c aes 128 encryption for .net aes.net aes 的目标 c aes 128 加密
【发布时间】: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 加密,我从以下位置获取代码:

AES interoperability between .Net and iPhone?

【问题讨论】:

  • iPhone代码在哪里?您引用的问题没有它(问题中的链接指向一个空白页面)。我注意到的一件事是您使用加密文本作为 IV;这几乎肯定是错误的。
  • 另外,AES 是 Rijndael 的“专用”版本。您需要确保设置正确的密钥大小和填充(KeySize = 256; BlockSize = 128; Mode = CipherMode.CBC; Padding = PaddingMode.PKCS7
  • @gdubs:你的代码可能会让一些人感到惊讶。至少在正确的大括号中完成它会有助于提高可读性。
  • 我没有看到任何 Objective-C。为什么这个问题被标记为这样?
  • 错误不可重现。请提供正确的最小工作示例。

标签: c# objective-c base64 aes


【解决方案1】:

您可以找到适用于 iPhone 和 .NET 的现成示例here

一般来说,密码算法是通用的,应该可以跨不同的语言工作,只是您需要确保这两种算法(即在 .NET 和 iPhone 中):

  • 使用以相同方式编码的完全相同的密钥进行存储/传输(通常是 base64)
  • 具有完全相同的参数,包括填充架构、操作模式(例如 CBC/ECB)

【讨论】:

  • 这实际上是我试图用来加密的。解密是我遇到的一些问题,因为我的做法与他的做法不同。
【解决方案2】:

查看AES Keeping your documents secure article on MSDN 并向下滚动到标题为“使用 AES 类”的部分,“图 15 使用 AES”有一个很好且简单的加密/解密示例。

附:请注意在某些块密码(如 AES)模式(如 CBC)中使用的填充,当不同的系统相互通信时,这些可能会很痛苦,因为填充/块大小可能因一个系统而异...见padding fun

编辑:刚刚发现了这个小宝石...simple-2-way-encryption-for-c-sharp

【讨论】: