Android C、C++与java端3DES互通

Stella981
• 阅读 369
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zxdscn/article/details/78104659
         <!--一个博主专栏付费入口结束-->
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-d284373521.css">
                                    <div id="content_views" class="markdown_views">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <ol>
  • 为了使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
    1. 全部代码为:
    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
                <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-526ced5128.css" rel="stylesheet">
                    </div>
    
    点赞
    收藏
    评论区
    推荐文章
    秃头王路飞 秃头王路飞
    4个月前
    webpack5手撸vue2脚手架
    webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
    光头强的博客 光头强的博客
    4个月前
    Java面向对象试题
    1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
    刚刚好 刚刚好
    4个月前
    css问题
    1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
    blmius blmius
    1年前
    MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
    文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
    小森森 小森森
    4个月前
    校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
    后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
    晴空闲云 晴空闲云
    4个月前
    css中box-sizing解放盒子实际宽高计算
    我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
    艾木酱 艾木酱
    3个月前
    快速入门|使用MemFire Cloud构建React Native应用程序
    MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
    NVIDIA安培架构下MIG技术分析
    关键词:NVIDIA、MIG、安培一什么是MIG2020年5月,NVIDIA发布了最新的GPU架构:安培,以及基于安培架构的最新的GPU:A100。安培提供了许多新的特性,MIG是其中一项非常重要的新特性。MIG的全名是MultiInstanceGPU。NVIDIA安培架构中的MIG模式可以在A100GPU上并行运行七个作业。多实
    helloworld_28799839 helloworld_28799839
    4个月前
    常用知识整理
    Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue
    密钥管理系统-为你的天翼云资产上把“锁
    本文关键词:数据安全,密码机,密钥管理一、你的云上资产真的安全么?1.2021年1月,巴西的一个数据库30TB数据被破坏,泄露的数据包含有1.04亿辆汽车和约4000万家公司的详细信息,受影响的人员数量可能有2.2亿;2.2021年2月,广受欢迎的音频聊天室应用Clubhouse的用户数据被恶意黑客或间谍窃取。据悉,一位身份不明的用户能够将Clubho