【问题标题】:How to encrypt an NSString in Objective C with DES in ECB-Mode?如何在 ECB 模式下使用 DES 加密 Objective C 中的 NSString?
【发布时间】:2011-01-31 12:22:26
【问题描述】:

我正在尝试在 iPhone 上的 Objective C 中加密一个 NSString。至少当我编码 "us=foo;pw=bar;pwAlg=false;" 时,我不想得到像 "TmsbDaNG64lI8wC6NLhXOGvfu2IjLGuEwc0CzoSHnrs=" 这样的字符串通过使用这个键:“testtest”。

我现在的问题是,CCCrypt 总是返回“4300 - 参数错误”,我不知道为什么。

这是我的代码(5 小时 google 和 try'n'error 的结果):

NSString *token = @"us=foo;pw=bar;pwAlg=false;";
NSString *key = @"testtest";

const void *vplainText;
size_t plainTextBufferSize;

plainTextBufferSize = [token length];
vplainText = (const void *) [token UTF8String];

CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t *movedBytes;

bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
// memset((void *) iv, 0x0, (size_t) sizeof(iv));


NSString *initVec = @"init Vec";
const void *vkey = (const void *) [key UTF8String];
const void *vinitVec = (const void *) [initVec UTF8String];

ccStatus = CCCrypt(kCCEncrypt,
                   kCCAlgorithmDES,
                   kCCOptionECBMode,
                   vkey, //"123456789012345678901234", //key
                   kCCKeySizeDES,
                   NULL,// vinitVec, //"init Vec", //iv,
                   vplainText, //"Your Name", //plainText,
                   plainTextBufferSize,
                   (void *)bufferPtr,
                   bufferPtrSize,
                   movedBytes);

NSString *result;
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64Encoding];

【问题讨论】:

    标签: iphone base64 encode des


    【解决方案1】:

    ECB 模式中的 DES 加密使用 8 字节的块大小,并单独编码每个块。问题是您的输入字符串没有平均分成 8 个字节,并且密码器不知道如何处理最终的非 8 字节块。

    修复方法是允许密码器通过将 kCCOptionPKCS7Padding 添加到 CCCrypt 的选项来填充最终块。例如(来自 NSData 加密类别的 sn-p):

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, 
                                          kCCAlgorithmDES, 
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, 
                                          kCCKeySizeDES,
                                          NULL, 
                                          [self bytes], 
                                          dataLength,
                                          buffer, 
                                          bufferSize
                                          &numBytesEncrypted);
    

    查看post,了解有关填充算法的更多详细信息。希望这会有所帮助。

    【讨论】:

    • 好的,这对我有用,谢谢!现在我有以下结果: "Tm==Da==64==8w==NL==OG==u2==LG==wc==zo==nrs=" 但我想要: "TmsbDaNG64lI8wC6NLhXOGvfu2IjLGuEwc0CzoSHnrs=" 没有所有的等号。你知道如何解决这个问题吗?
    • 解决了。我现在从这里使用 base64-encoding-method,它始终不产生“==”:cocoadev.com/index.pl?BaseSixtyFour
    • 谢谢@crafterm。救了我的命!
    • 非常感谢,这是对我的问题的第一个真正答案......但是,您能否也解释一下如何使用其他逐块 API?不是一次性的 CCCrypt 吗?我需要在 DES_set_key 等之后转换使用 openSSL DES_ecb_encrypt 的旧 ntlm 身份验证代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多