【问题标题】:Encrypt/decrypt string with des cbc mode obj-c使用des cbc模式obj-c加密/解密字符串
【发布时间】:2012-07-07 14:38:39
【问题描述】:

大家好,我是 obj-c 世界的新手,我想知道如何在 des 中加密字符串?我已经尝试过搜索,但找不到任何可以帮助我的示例代码我唯一意识到的是有一个类 commonCrypt 可以做我想做的事,但我不知道如何使用它

我的代码

NSString* key = @"abc43HU0";
NSString *token = @"hellohello";


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 = NULL;

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 *) [key UTF8String];

ccStatus = CCCrypt(kCCEncrypt,
                   kCCAlgorithmDES,
                   kCCModeCBC,
                   vkey, //"123456789012345678901234", //key
                   kCCKeySizeDES,
                   vinitVec,// 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;

crypt_result.text = myData;

【问题讨论】:

  • 经典问题的经典评论:你试过什么?除此之外,你不应该再在 DES 中加密,它既慢又不安全。
  • 我试图按照这个例子stackoverflow.com/questions/2512184/…但是xcode用这个错误提醒我'NSData'没有可见的@interface在'result = [myData base64encoding;'行声明选择器'base64encoding''
  • 没有完整性检查,有效的 56 位密钥大小和 ECB 模式加密来完成它。学习加密的第一步很好,但它完全不安全。如此之多,以至于您不妨请罗马人为您进行加密。
  • 我知道这是不安全的,但我的应用程序需要与使用此算法加密信息的后端应用程序进行通信,我已经注意到它是不安全的但还没有人改变,直到那么我将不得不使用 DES
  • 现在 base64encoding 不会给我一个错误,但我收到 nil 结果,因为 mydata 是 nil,我认为 CCCrypt 中的某些参数是错误的,任何帮助解决这个问题?

标签: objective-c ios encryption des


【解决方案1】:

这是工作代码:

NSString* key = @"abc43HU0";
NSString *token = @"hellohello";

const void *vplainText;
size_t plainTextBufferSize = [token length];
vplainText = (const void *) [token UTF8String];    
CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;

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

Byte iv [] = {0x65, 0x110, 0x68, 0x26, 0x69, 0x178, 0x200, 0x219};

const void *vkey = (const void *) [key UTF8String];

ccStatus = CCCrypt(kCCEncrypt,
                   kCCAlgorithmDES,
                   kCCOptionPKCS7Padding,
                   vkey, 
                   kCCKeySizeDES,
                   iv,
                   vplainText,
                   plainTextBufferSize,
                   (void *)bufferPtr,
                   bufferPtrSize,
                   &movedBytes);

NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
NSString* result = [base64 base64EncodeData:myData];//my own method to encoding with base64

【讨论】:

    【解决方案2】:

    尝试kCCOptionPKCS7Padding | kCCModeCBC 获取 ccOptions 参数。

    【讨论】:

    • 异或?我想我从来没有见过它被这样使用。你确定你的意思不是 OR |?
    • @trojanfoe 是的,| 也可以使用,但由于位掩码不应该包含同一索引上的任何位,您不妨使用^。 | 对读者来说更清楚,所以使用它。 (你不知道密码学家能做的就是异或吗?)
    • 所以你可以使用 OR 或 Exclusive OR?对不起,我不认为你是对的。如果要清除位,请使用 AND 操作的逆操作;即kCCOptionPKCS7Padding & ~kCCModeCBC.
    • @trojanfoe 说你有一个常量 0001 二进制(使用位索引 0)和另一个常量 0010 二进制(使用位索引 1)然后是 0001 ^ 0010 == 0001 | 0010 == 0011。如果您有不同的选择,这些位应该是分开的(不同的索引)。
    • 是的,您会得到相同的结果,但您必须知道这些值是什么;当您想使用不同的选项时会发生什么?您必须检查 XOR 是否为您提供了正确的值,而不仅仅是在使用 OR 时知道它会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多