- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要加密 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==
最佳答案
至少,您使用的是不同的初始化向量 (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/
我是一名优秀的程序员,十分优秀!