gpt4 book ai didi

.net - .Net 和 iPhone 之间的 AES 互操作性?

转载 作者:行者123 更新时间:2023-12-03 18:18:56 25 4
gpt4 key购买 nike

我需要加密 iPhone 上的字符串并将其发送到 .Net Web 服务进行解密。我可以在 iPhone 上使用 .Net 进行加密/解密,但来自 iPhone 的加密字符串无法通过 .Net 解密。我收到的错误是“填充无效且无法删除。”

.Net代码来自: http://blog.realcoderscoding.com/index.php/2008/07/dot-net-encryption-simple-aes-wrapper/

iPhone 代码使用以下示例代码:http://nootech.wordpress.com/2009/01/17/symmetric-encryption-with-the-iphone-sdk/

据我所知,我的关键设置是相同的:

result.BlockSize = 128; // iPhone: kCCBlockSizeAES128
result.KeySize = 128; // kCCBlockSizeAES128
result.Mode = CipherMode.CBC;
result.Padding = PaddingMode.PKCS7; // kCCOptionPKCS7Padding

我尝试了不同的方法来生成密文。你好/你好是:

.Net 中的 e0PnmbTg/3cT3W+92CDw1Q==

iPhone 上的 yrKe5Z7p7MNqx9+CbBvNqQ==

和“openssl enc -aes-128-cbc -nosalt -a -in hello.txt -pass pass:hello”生成:QA+Ul+r6Zmr7yHipMcHSbQ==

更新:I've posted the working code for this here .

最佳答案

至少,您使用的是不同的初始化向量 (IV)。

  • .Net 代码使用 IV key 。

    private static AesCryptoServiceProvider GetProvider(byte[] key)
    {
    //Set up the encryption objects
    AesCryptoServiceProvider result = new AesCryptoServiceProvider();
    byte[] RealKey = Encryptor.GetKey(key, result);
    result.Key = RealKey;
    result.IV = RealKey;
    return result;
    }

    private static byte[] GetKey(byte[] suggestedKey, AesCryptoServiceProvider p)
    {
    byte[] kRaw = suggestedKey;
    List kList = new List();
    for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8 )
    {
    kList.Add(kRaw[i % kRaw.Length]);
    }
    byte[] k = kList.ToArray();
    return k;
    }

    可能应该是:kList.Add(kRaw[(i/8) % kRaw.Length]);。否则,长度为 % 8 == 0 的 key 将重复使用相同的字母,doh!

    因此 .Net 使用的 IV(和 key )是:hleolhleolhleolh。这不是 API 的一部分,而是由于您指向的包装器代码(其中有一个严重的错误......)所致。

  • iPhone 代码使用 0 表示 IV。

    // Initialization vector; dummy in this case 0's.
    uint8_t iv[kChosenCipherBlockSize];
    memset((void *) iv, 0x0, (size_t) sizeof(iv));
  • openssl 默认情况下会在前面添加一个随机生成的盐(这就是输出更长的原因!)。

openssl 输出更安全,因为它预先考虑了随机初始化向量。看起来 Base64 解码字符串的前几个字节是“Salted__”。您还可以要求 openssl 不要使用盐 (-nosalt) 和/或提供 IV (-iv)。

本质上,openssl、.Net 和 iPhone 使用相同的加密,您只需要注意如何使用加密 key 和初始化向量初始化 API。

关于.net - .Net 和 iPhone 之间的 AES 互操作性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/538435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com