【问题标题】:AES Encryption between .NET WinRT and iOS Obj-C isn't the same.NET WinRT 和 iOS Obj-C 之间的 AES 加密不一样
【发布时间】: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


【解决方案1】:

这里是工作代码,主要区别在于数据长度占 UTF16 每个字符两个字节:

u_int8_t  keyPtr[32];
bzero(keyPtr, sizeof(keyPtr));
u_int8_t  ivPtr[32];
bzero(ivPtr, sizeof(ivPtr));

NSString *text = @"ABCDEFGH";
NSUInteger dataLength = [text length] * 2; // Allow for utf16
void * buffer = malloc(dataLength);
[text getBytes:buffer maxLength:dataLength usedLength:nil encoding:NSUTF16BigEndianStringEncoding options:0 range:NSMakeRange(0, dataLength) remainingRange:nil];

size_t bufferSize = dataLength * kCCBlockSizeAES128;
u_int8_t * bufferOut = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, ivPtr, buffer, dataLength, bufferOut, bufferSize, &numBytesEncrypted);

printf("encoded text in decimal: ");
for (int i=0; i<numBytesEncrypted; i++) {
    printf("%d ", bufferOut[i]);
}
printf("\n");

打印输出:

十进制编码文本: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

是的,这是非常糟糕的代码,我做了必要的最小更改。我想一个新时代正在进入一个十进制数据转储的新时代,十六进制已经死了。

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2011-11-22
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多