项目是使用3DES算法,ECB分组加密模式。

我们后端使用的加密过程:对明文进行十六进制编码,在使用3DES加密。iOS端解密需要把密文进行二进制解码,再使用3DES解密。后来查阅资料看到,后端也可以对明文base64编码,然后使用DES加密。iOS做出相应的逆变换即可。

ps:二进制和十六进制格式转换下文有介绍。

从一段JAVA代码看起:

Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding");

以前写的代码,给的参数都是DES或DESede。实际上DESede是简写,它与DESede/ECB/PKCS5Padding等价。这个参数分为三段。

第一段是加密算法的名称,如DESede实际上是3-DES。这一段还可以放其它的对称加密算法,如Blowfish等。

第二段是分组加密的模式,除了CBC和ECB之外,还可以是NONE/CFB/QFB等。最常用的就是CBC和ECB了。DES采用分组加密的方式,将明文按8字节(64位)分组分别加密。如果每个组独立处理,则是ECB。CBC的处理方式是先用初始向量IV对第一组加密,再用第一组的密文作为密钥对第二组加密,然后依次完成整个加密操作。如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,但CBC则不会。

第三段是指最后一个分组的填充方式。大部分情况下,明文并非刚好64位的倍数。对于最后一个分组,如果长度小于64位,则需要用数据填充至64位。PKCS5Padding是常用的填充方式,如果没有指定,默认的方式就是它。

补充一点,虽然DES的有效密钥长度是56位,但要求密钥长度是64位(8字节)。3DES则要求24字节。

再来一段iOS代码

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

kCCAlgorithm3DES,

kCCOptionPKCS7Padding|kCCOptionECBMode,

[key UTF8String],

kCCKeySize3DES,

NULL,

[cipherData bytes],

[cipherData length],

buffer,

1024,

&numBytesDecrypted);

参数解读:

kCCDecrypt:告知是解密过程。

kCCAlgorithm3DES:加密算法名称。

kCCOptionPKCS7Padding|kCCOptionECBMode:对应后端的分组加密模式,这里一定要加上kCCOptionECBMode填充模式,因为我们后端是使用的ECB填充模式。

初始化向量为空:ECB没有初始化向量。

kCCKeySize3DES:有效秘钥长度DES和3DES不同。

如果是使用CBC,对初始化向量IV的初始化可能有几种方法,自行测试:

第一种

const Byte iv[] = {1,2,3,4,5,6,7,8};

第二种

const Byte iv[] = {0,1,2,3,4,5,6,7};

第三种

NSString *testString = key;

NSData *testData = [testString dataUsingEncoding: NSUTF8StringEncoding];

Byte *iv = (Byte *)[testData bytes];

第三种key值说明:即是你的秘钥。

最后贴上项目中代码:

加密:

//加密

-(NSString *) encryptUseDES2:(NSString *)plainText key:(NSString *)key{

NSString *ciphertext = nil;

const char *textBytes = [plainText UTF8String];

size_t dataLength = [plainText length];

uint8_t *bufferPtr = NULL;

size_t bufferPtrSize = 0;

size_t movedBytes = 0;

bufferPtrSize = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);

bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));

memset((void *)bufferPtr, 0x0, bufferPtrSize);

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES,

kCCOptionPKCS7Padding|kCCOptionECBMode,

[key UTF8String], kCCKeySize3DES,

NULL,

textBytes, dataLength,

(void *)bufferPtr, bufferPtrSize,

&movedBytes);

if (cryptStatus == kCCSuccess) {

ciphertext= [self parseByte2HexString:bufferPtr :(int)movedBytes];

}

ciphertext=[ciphertext uppercaseString];//字符变大写

return ciphertext ;

}

加密用到的二进制转化十六进制方法:

- (NSString *) parseByte2HexString:(Byte *) bytes :(int)len{

NSString *hexStr = @"";

if(bytes)

{

for(int i=0;i

{

NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff]; ///16进制数

if([newHexStr length]==1)

hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];

else

{

hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];

}

NSLog(@"%@",hexStr);

}

}

return hexStr;

}

解密:

- (NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key

{

NSData* cipherData = [self convertHexStrToData:[cipherText lowercaseString]];

NSLog(@"++++++++///%@",cipherData);

unsigned char buffer[1024];

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

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

kCCAlgorithm3DES,

kCCOptionPKCS7Padding|kCCOptionECBMode,

[key UTF8String],

kCCKeySize3DES,

NULL,

[cipherData bytes],

[cipherData length],

buffer,

1024,

&numBytesDecrypted);

NSString* plainText = nil;

if (cryptStatus == kCCSuccess) {

NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];

plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

}

return plainText;

}

解密过程用到的十六进制转换二进制:

- (NSData *)convertHexStrToData:(NSString *)str {

if (!str || [str length] == 0) {

return nil;

}

NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];

NSRange range;

if ([str length] % 2 == 0) {

range = NSMakeRange(0, 2);

} else {

range = NSMakeRange(0, 1);

}

for (NSInteger i = range.location; i < [str length]; i += 2) {

unsigned int anInt;

NSString *hexCharStr = [str substringWithRange:range];

NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];

[scanner scanHexInt:&anInt];

NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];

[hexData appendData:entity];

range.location += range.length;

range.length = 2;

}

NSLog(@"hexdata: %@", hexData);

return hexData;

}

JAVA的3DES加密代码转成oc_iOS之DES加密相关推荐

  1. 实战SSM_O2O商铺_44【DES加密】 关键配置信息进行DES加密

    文章目录 概述 工程结构 DES工具类 修改配置文件中的用户名和密码 继承PropertyPlaceholderConfigurer,重写convertProperty方法 配置自定义的Encrypt ...

  2. 在Java中使用DES加密解密算法

    import javax.crypto.*; import javax.crypto.spec.DESKeySpec; import java.security.NoSuchAlgorithmExce ...

  3. php加密 java rsa_PHP的DES加密和RSA签名(兼容java)

    主要用于php对接java的接口 rsa签名用SHA1WithRSA算法<?php /** * DES加密/解密,RSA加密/验签 * @author jiangwei * @version $ ...

  4. Python 爬虫进阶必备 | 某音乐网站查询参数加密逻辑分析(分离式 webpack 的加密代码扣取详解)...

    点击上方"咸鱼学Python",选择"加为星标" 第一时间关注Python技术干货! 今日网站 aHR0cDovL3d3dy5rdXdvLmNuL3NlYXJj ...

  5. Go语言的DES加密(CBC模式, ECB模式) ---- 与java加密互通(转)

    问题场景: 业务需要对接接口, 采用DES加密方式加密, 于是google一下go的DES加密方式, go的DES的默认隐藏了ECB模式, 因为go认为ECB不安全, 所以不建议使用,就隐藏了, 然而 ...

  6. DES加密解密算法(前端后端)

    DES加密解密算法(前端&后端) 原作者 阿弥陀佛1114  原文链接:https://blog.csdn.net/zong1114/article/details/51754470 DES对 ...

  7. verilog 实现DES加密

    verilog 实现DES加密 1 总体思路 要实现DES加密其实只需要按照步骤,设计组合逻辑就能完成.为了每个步骤前后顺序相对可控,我将其粗略分为几个步骤 第一步:密钥PC-1置换,该步骤将64位的 ...

  8. Java中3DES加密解密示例

    在java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包: jce.jar security/US_export_policy. ...

  9. 3des java ecb_PHP 3DES加密 与JAVA通用 加密模式:ECB

    昨天帮同事解决了一个接口加密的算法,同事是个小姑娘,不懂,所以老大派我协助她,所以我为了不在姑凉面前掉面子~~火速解决它... 甲方是电信,JAVA写的接口,我一听头就大了,大家都知道~~PHP在加密 ...

最新文章

  1. 阿里移动|《蚂蚁金服移动端高可用技术实践》
  2. Apache常见功能实战详解
  3. java号段_JAVA手机号正则(多号段)
  4. android layoutparams,Android LayoutParams用法解析
  5. PHP页面中嵌套go语言,go语言嵌套类型的使用细节
  6. Qt5 自创简单音乐视频播放器(基础版)
  7. 20190825 On Java8 第十二章 集合
  8. Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)
  9. 饥荒联机版Mod开发——制作栏(九)
  10. python刷网易云_如何用Python爬取网易云歌曲?秘诀在这~
  11. Notes真的无处不在
  12. GoLang读写数据---上
  13. linux windows C++开发差异
  14. 《机器学习技法》第5课笔记 核函数逻辑回归
  15. android 吐泡泡动画,android仿摩拜贴纸碰撞|气泡碰撞
  16. dnf用计算机算比例,DNF比例计算查询
  17. visual studio 2022安装vsix插件
  18. 身份证号要是能修改就好了,不怕被骗子骗了
  19. 未来五年最值得投资的是哪个方向,为什么?
  20. 前端无法反序列化START\u数组标记-JSONCannot deserialize instance of `java.lang.String` out of START_ARRAY toke

热门文章

  1. Java实现 蓝桥杯VIP 算法提高 班级排名
  2. HDU-4745-Two Rabbits
  3. Ideas Of MySelf 20005-07-26
  4. 抗锯齿插件MadGoat-SSAA使用需要注意的地方
  5. Python图片处理模块PIL操作方法(pillow)(转载)
  6. Ubuntu Desktop gedit
  7. 爬虫+pyqt5 打造属于自己的抖音视频下载器
  8. 前端代码调试:Webstorm调试js
  9. 设计师常用的7款界面设计工具!
  10. QT 项目 智能家居系统 上位机