Android C、C++与java端3DES互通
时间:2019-11-13
本文章向大家介绍Android C、C++与java端3DES互通,主要包括Android C、C++与java端3DES互通使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
- 为了使C端与java端的3des加解密互通,我们一般使用“DESede/ECB/NoPadding”加密模式;
- 而在我们java端,我们都知道3des的密钥都是24字节的,而C端是16字节,此处为重点:我们java端的密钥组成为16字节密钥 + 其前8个字节组成24字节密钥;
- 请看代码:
private static byte[] fillTo24(byte[] key) {
if (null != key && key.length == 16) {
return Util.pinJie2(key, Util.subBytes(key, 0, 8));
}
return null;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 全部代码为:
public class DES3Utils {
// 向量
public final static String iv = "12345678";
// 3des加密
public static final String algorithm = "DESede";
// 加密 src为源数据的字节数组
public static byte[] encryptBy3DES(byte[] src, byte[] key) {
return init(src, key, true, 0);
}
// 解密函数
public static byte[] decryptBy3DES(byte[] src, byte[] key) {
return init(src, key, false, 0);
}
/**
* @param src 需要加密的文字
* @return 加密后的文字
* @throws Exception 加密失败
*/
public static byte[] encryptBy3DESCBC(byte[] src, byte[] key) {
byte[] fillTo24 = fillTo24(key);
if (null == fillTo24)
return null;
try {
SecretKey deskey = new SecretKeySpec(fillTo24, algorithm);
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
return cipher.doFinal(src);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 3DES解密
*
* @param encryptText 加密文本
* @return
* @throws Exception
*/
public static byte[] decryptBy3DESCBC(byte[] encryptText, byte[] key) {
byte[] fillTo24 = fillTo24(key);
if (null == fillTo24)
return null;
try {
SecretKey deskey = new SecretKeySpec(fillTo24, algorithm);
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
return cipher.doFinal(encryptText);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* @param src 需要加密的文字
* @return 加密后的文字
* @throws Exception 加密失败
*/
public static byte[] encryptBy3DESECB(byte[] src, byte[] key) {
return init(src, key, true, 1);
}
/**
* 3DES解密
*
* @param encryptText 加密文本
* @return
* @throws Exception
*/
public static byte[] decryptBy3DESECB(byte[] encryptText, byte[] key) {
return init(encryptText, key, false, 1);
}
private static byte[] init(byte[] data, byte[] key, boolean mode, int type) {
byte[] fillTo24 = fillTo24(key);
if (null == fillTo24)
return null;
String types = null;
try {
SecretKey deskey = new SecretKeySpec(fillTo24, algorithm);
switch (type) {
case 0:
types = "DESede";
break;
case 1:
types = "DESede/ECB/NoPadding";
break;
case 2:
types = "DESede/ECB/PKCS5Padding";
break;
}
Cipher cipher = Cipher.getInstance(types);
if (mode)
cipher.init(Cipher.ENCRYPT_MODE, deskey);
else
cipher.init(Cipher.DECRYPT_MODE, deskey);
return cipher.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static byte[] fillTo24(byte[] key) {
if (null != key && key.length == 16) {
return Util.pinJie2(key, Util.subBytes(key, 0, 8));
}
return null;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
原文地址:https://www.cnblogs.com/zx-blog/p/11849856.html
- 唐良:云端架构给电商行业带来创新力
- 邹方明:看腾讯云如何架构海量存储系统
- 王之捷:AI智能云端架构大幅提升智能语音识别能力
- 精彩大放送 | 腾讯云:容器架构向无服务架构的演进
- Python 数据分析学习笔记
- 如何用Fiddler抓取https
- 人工智能与大数据结合,帮助降低自杀率
- “多态”的数据库连接池实现
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- 用js代码理解区块链,最简版本
- 谈谈IE针对Ajax请求结果的缓存
- Ajax请求过程中显示“进度”的简单实现
- ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
- 【深度学习系列】卷积神经网络详解(二)——自己手写一个卷积神经网络
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vant 1.0 正式发布:轻量、可靠的移动端 Vue 组件库
- SAP CDS view单元测试框架Test Double介绍
- 漫谈 React 组件库开发(二):组件库最佳实践
- 搭建简易的物联网服务端和客户端-移动家庭能力平台【1】(二十三)
- 异步系统的两种测试方法
- 实习第五周
- 跨平台长连接组件设计及可插拔改造
- 搭建简易的物联网服务端和客户端-移动家庭能力平台【2】(二十四)
- 一些能提高ABAP开发人员日常工作效率的ABAP小工具
- 实习第六周
- 从源码看微信小程序启动过程
- mysql遇到的问题
- Angularjs下拉框联动(1)
- WEB-UI 自动化实践
- 基于动态代理 Mock Dubbo 服务的实现方案