gpt4 book ai didi

c# - AES: 使用 CCCrypt() 方法加密,使用 C# 解密,输出错误

转载 作者:行者123 更新时间:2023-11-30 22:15:21 28 4
gpt4 key购买 nike

使用CCCrypt()方法加密,然后在C#中解密。但输出与原始纯文本不同。

key 长度为256位,IV为默认值。

主要代码如下:

// Encrypt
{
// the key is 32 bytes (256 bits).
Byte iv[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, // Operation
kCCAlgorithmAES128, // Algorithm
kCCOptionPKCS7Padding, // Option
keyPtr, // key
kCCKeySizeAES256, // key length
iv, /* initialization vector (optional) */
[self bytes], // plain text
dataLength, /* input */
buffer,
bufferSize, /* output */
&numBytesEncrypted); //dataOutMove
if (cryptStatus == kCCSuccess) {
NSData *encryptedData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
NSString *encryptedString = [encryptedData base64Encoding];
}

// Decrypted
{
byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
public static string AESDecrypt(string encryptedString, string key)
{
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 256;
aes.IV = _key1;
aes.Key = Encoding.UTF8.GetBytes(key);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;

// Convert Base64 strings to byte array
byte[] src = System.Convert.FromBase64String(encryptedString);

// decryption
using (ICryptoTransform decrypt = aes.CreateDecryptor())
{
byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
return Encoding.UTF8.GetString(dest);
}
}
}

编辑:我发现原因是 keyPtr。在加密过程中,我像这样提前处理 key :

char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) [key
getCString:keyPtr maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];

现在,我像这样修改这些代码:

NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger keyLength = [keyData length];
Byte *keyPtr= (Byte *)malloc(keyLength);
memcpy(keyPtr, [keyData bytes], keyLength);

然后我得到了正确的输出。虽然问题没有了,但是真不知道之前的版本哪里出了问题。

最佳答案

Crypto 被设计为即使出现一个小错误也会严重失败。您需要明确检查键是否逐字节相同(检查字节,而不是字符)。 IV 也一样。您正在以 CBC 模式解码。你确定加密是CBC模式吗?它没有在您的代码中明确设置。与填充相同。您确定加密方法使用的是 PKCS7 吗?

通常不要依赖默认设置,而是在您的代码中明确设置它们。

最后一点,您是否在两侧使用了相同的字节 <-> 字符转换。同样,最好明确说明您正在使用什么。例如,UTF-8 文本可能带有初始 BOM,UTF-8 转换将忽略该 BOM,但不同的转换将包含在字节中。

关于c# - AES: 使用 CCCrypt() 方法加密,使用 C# 解密,输出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18008590/

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