【发布时间】:2014-06-01 10:04:03
【问题描述】:
我很难让我的 iOS AES 加密/解密与我在 WinRT 上的加密/解密相同。
我无法更改 WinRT 端的实现,因为它用于已发布的应用程序中。
这是我用归零键和归零 iv 制作的两个样本,输出不同。
C# 示例代码:
using (MemoryStream saveDataMemoryStreamCrypto = new MemoryStream())
{
var saveDataKeyProvider = Windows.Security.Cryptography.Core.SymmetricKeyAlgorithmProvider.OpenAlgorithm(Windows.Security.Cryptography.Core.SymmetricAlgorithmNames.AesCbcPkcs7);
var saveDataKeyBuffer = Windows.Security.Cryptography.CryptographicBuffer.CreateFromByteArray(new byte[32]);
var saveDataKey = saveDataKeyProvider.CreateSymmetricKey(saveDataKeyBuffer);
var saveDataSaltBuffer = Windows.Security.Cryptography.CryptographicBuffer.CreateFromByteArray(new byte[32]);
var saveDataDataBuffer = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary("ABCDEFGH", Windows.Security.Cryptography.BinaryStringEncoding.Utf16BE);
var saveDataOutBuffer = Windows.Security.Cryptography.Core.CryptographicEngine.Encrypt(saveDataKey, saveDataDataBuffer, saveDataSaltBuffer);
var saveDataOutBytes = saveDataOutBuffer.ToArray();
}
C# 字节输出:
80 87 109 195 133 40 205 81 117 91 17 132 229 3 119 251 205 8 246 64 13 57 210 142 11 153 121 39 122 196 63 10
Obj-C 示例代码:
Byte keyPtr[32];
bzero(keyPtr, sizeof(keyPtr));
Byte ivPtr[32];
bzero(ivPtr, sizeof(ivPtr));
NSString *text = @"ABCDEFGH";
NSUInteger dataLength;
void * buffer = malloc([text length]);
[text getBytes:buffer maxLength:[text length] usedLength:&dataLength encoding:NSUTF16BigEndianStringEncoding options:0 range:NSMakeRange(0, dataLength) remainingRange:nil];
size_t bufferSize = dataLength * kCCBlockSizeAES128;
void * bufferOut = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, ivPtr, buffer, dataLength, bufferOut, bufferSize, &numBytesEncrypted);
Obj-C 字节输出:
23 144 186 234 149 182 123 79 155 234 250 54 52 38 151 87 179 62 176 1 203 115 59 1 35 54 176 1 44 213 120 1
有人知道我做错了什么吗?
谢谢, 格雷格
【问题讨论】:
-
首先把你的尺寸弄对。您需要一个 16 字节的 IV,而您的目标 C 缓冲区无法保存文本的 UTF16 编码。
标签: c# objective-c encryption windows-runtime aes