gpt4 book ai didi

ios - ios 中密码的 AES128 加密的正确方法

转载 作者:行者123 更新时间:2023-11-29 02:22:50 24 4
gpt4 key购买 nike

我遇到了密码加密问题。我正在使用 AES128 来加密数据。以下是代码:

LoginController.m

#import <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonCryptor.h>
#import <CommonCrypto/CommonKeyDerivation.h>
#import "NSData+AES.h"

- (IBAction)loginButtonClick:(id)sender
{
NSData *toencrypt = [password.text dataUsingEncoding:NSUTF8StringEncoding];
NSString *credentials = [self md5:[NSString stringWithFormat:@"63jhdf83hf73haf3983f"]]; //returns 679fb1ddf7d81bee0aff2ef251fe6bf5
NSString *iv = @"kdf67398DF7383fd";
NSData *data = [toencrypt AES128EncryptWithKey:credentials iv:iv];
NSString *postdata = [data base64Encoding]; //base64Encoding is implemented in NSData+AES.m
NSLog(@"Original Password: %@",password);
NSLog(@"Encrypted Password: %@",postdata);
}

**注意:md5 转换和 base64Encoding 工作正常。

NSData+AES.m

static char encodingTable[64] =
{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
};

@implementation NSData (AES)

- (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv
{
char keyPtr[kCCKeySizeAES128+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

char ivPtr[kCCKeySizeAES128+1];
bzero(ivPtr, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];
int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
int newSize = 0;

if(diff > 0){
newSize = (int)dataLength + diff;
}

char dataPtr[newSize];
memcpy(dataPtr, [self bytes], [self length]);
for(int i = 0; i < diff; i++){
dataPtr[i + dataLength] = 0x00;
}

size_t bufferSize = newSize + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
0x00, //No padding
keyPtr,
kCCKeySizeAES128,
ivPtr,
dataPtr,
sizeof(dataPtr),
buffer,
bufferSize,
&numBytesEncrypted);

if(cryptStatus == kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
return nil;
}

现在如果发送“brad”,它应该返回“ur/bq4Rz”。但不幸的是它返回 "83+eQZW3eI4UWGdNk4nnUw=="。有什么问题?请帮帮我。提前致谢。

最佳答案

请注意,此代码非常不安全。它为每条消息重复使用相同的 Key+IV,这大大简化了攻击者解密消息(尤其是短消息)的工作。它还有其他安全问题( key 空间差,填充方案差)

也就是说,特别损坏的部分是您传递了一个 32 字节(256 位)“ key ”,但您只使用了其中的 128 位。您可能打算使用 kCCKeySizeAES256 作为 key 长度。这与 kCCAlgorithmAES128 无关,它指的是 block 大小,而不是 key 长度。在 diff 代码中,您打算使用 kCCBlockSizeAES128 而不是 kCCKeySizeAES128,但它们都是 16,因此不会影响结果。

正如@Codo 指出的那样,标准 CBC 模式无法输出长度不是 16 字节倍数的密文。为什么您认为“ur/bq4Rz”是正确的加密方式?有一个 CBC 的修改可以做到这一点(它添加了所谓的“密文窃取”或 CTS),但这不受 iOS 支持。

您的代码正在执行零填充,这是一种非常糟糕的方法(您只是添加零直到达到 16 字节边界)。标准(且更安全)的解决方案是 PKCS#7 填充,您将关闭它。

如果我不得不猜测,您正在复制对数据进行零填充然后将密文截断到一定长度的代码。然后解密可能会用零填充密文,然后在末尾截断垃圾(可能基于事先知道长度)。我知道这是如何工作的,但这不是正常的方法。

如果您想了解如何简单地执行此操作的示例,请参阅 Properly Encrypting With AES and CommonCrypto .如果您想要一种更安全的方法来为您完成所有这些工作,请参阅 RNCryptor .但是,这些都不会生成与明文长度相同的密文。

关于ios - ios 中密码的 AES128 加密的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27922922/

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