ios的DES加密遇到的坑

1.刚知道要做DES加密以为很简单,网上代码很多,各种DES加密,大致都一样。然而我们的后台的安卓是用的一套DES加密算法,没啥问题。可是到了我这边,总是不一致。

2.经过多次测试发现,是我这边的DES加密模式和后台对不上。DES加密有两种模式,ECB和CBC。还有就是填充模式,ios的填充模式只有两种 kCCOptionPKCS7Padding  和kCCOptionPKCS7Padding | kCCOptionECBMode。而后台填充模式就多了。这就需要一一对应才能实现加密和解密。

3.具体的对应模式是java的DES/ECB/PKCS5Padding对应ios的kCCOptionPKCS7Padding | kCCOptionECBMode,DES/CBC/PKCS5Padding对应ios的kCCOptionPKCS7Padding 。

4.具体的怎么加密呢,如下。


+(NSData*) encryptUseDES:(NSString*)plainText key:(NSString*)key

{    NSData*data;

    NSString*ciphertext =nil;

    NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

    NSUIntegerdataLength = [textDatalength];

    unsignedcharbuffer[1024];

    memset(buffer,0,sizeof(char));

    size_tnumBytesEncrypted =0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding ,

                                          [keyUTF8String],kCCKeySizeDES,

                                          iv,

                                          [textDatabytes], dataLength,

                                          buffer,1024,

                                          &numBytesEncrypted);

    if(cryptStatus ==kCCSuccess) {

        data = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesEncrypted];

    }

    returndata;

}

 constByteiv[] = {1,2,3,4,5,6,7,8};   constByteiv[] = {0,1,2,3,4,5,6,7};

两个iv任选其一,必须要和你的后台对应。(CBC模式)


+(NSData*) encryptUseDES:(NSString*)plainText key:(NSString*)key

{    NSData*data;

    NSString*ciphertext =nil;

    NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

    NSUIntegerdataLength = [textDatalength];

    unsignedcharbuffer[1024];

    memset(buffer,0,sizeof(char));

    size_tnumBytesEncrypted =0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding | kCCOptionECBMode,

                                          [keyUTF8String],kCCKeySizeDES,

                                          NULL,

                                          [textDatabytes], dataLength,

                                          buffer,1024,

                                          &numBytesEncrypted);

    if(cryptStatus ==kCCSuccess) {

        data = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesEncrypted];

    }

    returndata;

}

不需要初始化iv的加密。(ECB模式)


5.具体的解密如下:

+(NSString*)decryptUseDES:(NSData*)cipherdata key:(NSString*)key

{

    NSData*plaindata =nil;

     NSString*plaintext =nil;

//    NSData *cipherdata = [GTMBase64 decodeString:cipherText];

    unsignedcharbuffer[1024];

    memset(buffer,0,sizeof(char));

    size_tnumBytesDecrypted =0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding ,

                                          [keyUTF8String],kCCKeySizeDES,

                                          iv,

                                          [cipherdatabytes], [cipherdatalength],

                                          buffer,1024,

                                          &numBytesDecrypted);

    if(cryptStatus ==kCCSuccess)

    {

        NSData*plaindata = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesDecrypted];

        plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];

    }

    returnplaintext;

}

需要iv的解密。


+(NSString*)decryptUseDES:(NSData*)cipherdata key:(NSString*)key

{

    NSData*plaindata =nil;

     NSString*plaintext =nil;

//    NSData *cipherdata = [GTMBase64 decodeString:cipherText];

    unsignedcharbuffer[1024];

    memset(buffer,0,sizeof(char));

    size_tnumBytesDecrypted =0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

                                          kCCOptionPKCS7Padding | kCCOptionECBMode,

                                          [keyUTF8String],kCCKeySizeDES,

                                          NULL,

                                          [cipherdatabytes], [cipherdatalength],

                                          buffer,1024,

                                          &numBytesDecrypted);

    if(cryptStatus ==kCCSuccess)

    {

        NSData*plaindata = [NSDatadataWithBytes:bufferlength:(NSUInteger)numBytesDecrypted];

        plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];

    }

    returnplaintext;

}

不需要iv的解密。



6.加密好的是Nsdata类型的,你们也可以转编码(BASE32和BASE64)都可以,根据你们的后端要求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 引言 如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在androi...
    freesan44阅读 1,251评论 1 1
  • 小结:其实网上大部分帖子已经给出相应的代码,但你会发现加密的结果不一致。有个关键点。 const char *te...
    narutocheen阅读 1,639评论 2 1
  • 之前的项目中接触过一些加密的方法,也没有太仔细的进行记录和研究。最近在写SDK时,加密模块的占比相当之大;借此时机...
    过半_e764阅读 702评论 0 0
  • 追不到喜欢的人 可是人生还没结束。
    Nacimei阅读 256评论 0 3
  • 午夜时分,一片寂静,内心却难以平复。 思绪万千,繁杂凌乱,言语也不知所云。 时光荏苒,罅隙之间,一切将飞逝而去。 ...
    小九八阅读 132评论 0 0

友情链接更多精彩内容