Objective-C AES 128加密用于.NET AES

3

我最终找到了一种更易于理解的方法,用同样的加密方式实现.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();

以下是“25f9e794323b453885f5181f1b624d0b”密钥和“heythere”信息的加密结果:

0suql40BUGiDoFA4SdXJAA==

这是使用我的.NET加密得到的:

unNWQfm9RaU/HgKlDNEmoXZaTzsuBoTNsA2UvDKZhc4=

PS:对于AES 128的iPhone加密,我从以下链接中获得了代码:

.NET和iPhone之间的AES互操作性?


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

0

请查看MSDN上的AES保护文档文章,并向下滚动到标题为“使用AES类”的部分,“图15使用AES”有一个漂亮而简单的加密/解密示例。

P.S.请注意,在某些块密码(如AES)模式(如CBC)中使用的填充方式,这些可能会在不同系统之间进行通信时成为问题,因为填充/块大小可能会因系统而异...请参见填充乐趣

编辑:刚刚发现这个小宝石... C#的简单双向加密


0

你可以在此处找到iPhone和.NET的示例 链接

通常,密码算法是通用的,并且应该跨不同的语言工作,只需要确保两个算法(即在.NET和iPhone上):

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

这实际上是我尝试使用的加密方法。解密则有些问题,因为我与他的做法不同。 - gdubs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接