美文网首页OC-开发案例收集
ios的DES加密遇到的坑

ios的DES加密遇到的坑

作者: zrasd | 来源:发表于2018-07-12 14:39 被阅读0次

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)都可以,根据你们的后端要求。

相关文章

  • ios的DES加密遇到的坑

    1.刚知道要做DES加密以为很简单,网上代码很多,各种DES加密,大致都一样。然而我们的后台的安卓是用的一套DES...

  • 面试题总结

    1. iOS开发中的加密方式 iOS加密相关算法框架:CommonCrypto。 对称加密: DES、3DES、A...

  • iOS 笔记之_时间戳 + DES 加密

    iOS 时间戳 + DES 加密 时间戳 DES 加密解密 加密内容:helloWorldDES加密成功加密结果:...

  • ios des 加密长度的坑

    今天在做des加密的时候,在网上找到这段代码 挺好用的,demo测试没什么问题 但是当我们加密长度大于1M的数据时...

  • DES加密 解密 java和iOS 保持一致

    1.java/android DES加密解密 base64编码用的jdk1.8 2.iOS DES加密解密

  • iOS 关于DES加密文本中有中文的问题

    DES加密中,遇到加密的文本中含有中文的情况: 记录一下这个问题 解密之后遇到这种情况 一般来说,DES加密的时候...

  • IOS的签名机制

    前言 了解IOS的数字签名机制之前我们需要掌握以下几个知识:加密解密(对称加密(DES 3DES AES),非对称...

  • Android Des/3DES加解密

    1、3DES加解密 DES加密分为 单DES和 3DES加密 单DES加密是8个字节长度加密 3DES加密分为:双...

  • Laravel 3DES (php、java、android、i

    Laravel 3DES Laravel 3DES加密解密,和java,ios互通 安装方法 配置方法 app.p...

  • iOS DES加密

    NSString分类创建 DES 宏定义key 加密 解密 在这里介绍一个三方工具 非常简单导入通过GTMBa...

网友评论

    本文标题:ios的DES加密遇到的坑

    本文链接:https://www.haomeiwen.com/subject/glxrpftx.html