技术标签: ECB NoPadding android 3DES
在搞银联POS机的东东,略感头疼,搞了N久,还是终端-Hulk 给的方法解决了3DES加密解密的难题。
import java.security.Key;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
public class HuldMethod {
public static void main(String[] args) throws Exception{
//0123456789ABCDEFFEDCBA9876543210 给的是16字节的密钥,但要凑够24个字节,所以截取前面的8个
//字节0123456789ABCDEF追加到密钥的后面
//byte[] key = Util.HexString2Bytes("0123456789ABCDEFFEDCBA9876543210");
byte[] key = Util.HexString2Bytes("0123456789ABCDEFFEDCBA98765432100123456789ABCDEF");
byte[] data = Util.HexString2Bytes("1234567887654321");
byte[] crypt = encrypt(data, key); // 3DES 加密
System.out.println("加密后: " + Util.bytesToHexString(crypt));
byte[] jiemi = decrypt(crypt, key);
System.out.println("解密后: " + Util.bytesToHexString(jiemi));
}
/**
* 合并字节数组
* @param byte_1
* @param byte_2
* @return
*/
public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) {
byte[] byte_3 = new byte[byte_1.length + byte_2.length];
System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
return byte_3;
}
public static byte[] decrypt(byte[] crypt, byte[] key) throws Exception {
Key k = toKey(key);
Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, k);
return cipher.doFinal(crypt);
}
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
Key k = toKey(key);
Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, k);
return cipher.doFinal(data);
}
public static SecretKey toKey(byte[] key) throws Exception {
KeySpec dks = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
return keyFactory.generateSecret(dks);
}
public static String getPasswordByKey24(String account,String passord,String pingankey) throws Exception
{
byte[] key = Util.HexString2Bytes(pingankey);
PinBlock pb = new PinBlock();
byte[] data = pb.process(passord,account);
byte[] crypt = encrypt(data, key); // 3DES 加密
return Util.bytesToHexString(crypt).toUpperCase();
}
public static String getPasswordByKey16(String account,String passord,String pingankey) throws Exception
{
String Key8 = pingankey.substring(0,16);
String Key = pingankey+Key8;
byte[] key = Util.HexString2Bytes(Key);
PinBlock pb = new PinBlock();
byte[] data = pb.process(passord,account);
byte[] crypt = encrypt(data, key); // 3DES 加密
return Util.bytesToHexString(crypt).toUpperCase();
}
public static String decryptKey(String crypt, String pingankey) throws Exception {
String Key8 = pingankey.substring(0,16);
String Key = pingankey+Key8;
byte[] key = Util.HexString2Bytes(Key);
byte[] data = Util.HexString2Bytes(crypt);
byte[] plain = decrypt(data, key); // 3DES 解密
return Util.bytesToHexString(plain).toUpperCase();
}
}
public class PinBlock {
/**
* getPinBlock
* ��ANSI X9.8 Format�������ʺ���Ϣ����PIN BLOCK����
* PIN BLOCK ��ʽ���� PIN ��λ��� ���ʺ�;
* @param pin String
* @param accno String
* @return byte[]
*/
public byte[] process(String pin, String accno) {
byte arrAccno[] = getHAccno(accno);
byte arrPin[] = getHPin(pin);
byte arrRet[] = new byte[8];
//PIN BLOCK ��ʽ���� PIN ��λ��� ���ʺ�;
for (int i = 0; i < 8; i++) {
arrRet[i] = (byte) (arrPin[i] ^ arrAccno[i]);
}
//Util.printHexString("PinBlock��", arrRet);
return arrRet;
}
/**
* getHPin
* ���������ת��
* PIN��ʽ
* BYTE 1 PIN�ij���
* BYTE 2 �C BYTE 3/4/5/6/7 4--12��PIN(ÿ��PINռ4��BIT)
* BYTE 4/5/6/7/8 �C BYTE 8 FILLER ��F�� (ÿ����F��ռ4��BIT)
* @param pin String
* @return byte[]
*/
private byte[] getHPin(String pin) {
byte arrPin[] = pin.getBytes();
byte encode[] = new byte[8];
encode[0] = (byte) 0x06;
encode[1] = (byte) Util.uniteBytes(arrPin[0], arrPin[1]);
encode[2] = (byte) Util.uniteBytes(arrPin[2], arrPin[3]);
encode[3] = (byte) Util.uniteBytes(arrPin[4], arrPin[5]);
encode[4] = (byte) 0xFF;
encode[5] = (byte) 0xFF;
encode[6] = (byte) 0xFF;
encode[7] = (byte) 0xFF;
//Util.printHexString("encoded pin��", encode);
return encode;
}
/**
* getHAccno
* ���ʺŽ���ת��
* BYTE 1 �� BYTE 2 0X0000
* BYTE 3 �� BYTE 8 12�����ʺ�
* ȡ���ʺŵ���12λ�����������ұߵ�У��λ��������12λ�
文章浏览阅读1k次。var appName = navigator.appName; //浏览器的正式名称 var appVersion = navigator.appVersion; //浏览器的版本号 var cookieEnabled = navigator.cookieEnabled; // 返回用户浏览器是否启用了..._浏览器获取客户端基本信息
文章浏览阅读1k次。1、 为什么要记录笔记这个问题我印象中探讨过很多次,但是简单来讲就是方便日后在遇到相似问题时查询解决方式,并在记录笔记的过程汇总中对知识进行一轮新的复习。这样一生,如果作为一个技术人员来讲的话,我不可能只学习一门技能,需要学习的东西很多。当只会一门技能时,做不做笔记其实无所谓,但是当你学会多种技能时,你需要笔记这样一个第二大脑来帮助存储那些琐碎并不通用的知识,你自己的大脑来记忆通用性的知识,可以迁移的方法。在遇到问题时,知道做什么永远比怎么做更重要。1.1 知识的分类1.1.1 元认知解释:能指导_印象笔记建立个人知识体系
文章浏览阅读2.7k次,点赞13次,收藏96次。随着硬盘/flash容量不断增大,存储的数据也越来越多,早期单一的对应地址存放对应数据的方案已经无法满足我们的需求,因此一群大佬们便开始设计文件系统这样一个东西,用来管理硬盘/flash上的数据信息。本文主要分享关于FAT文件系统的详细设计。通过对FAT文件系统组成介绍,字段分析并采用新增文件实践分析的方式,详细阐述FAT文件系统的工作原理!_fatfs
文章浏览阅读3k次,点赞2次,收藏7次。企业架构师是使 IT 战略与业务目标保持一致的重要且不断增长的角色。无论您对云、应用程序、软件还是系统感兴趣,企业架构认证都可以提升您的职业生涯。如果您计划从事企业架构师 (EA) 的职业,那么认证是验证您的 EA 技能的好方法。作为 EA,您将负责为企业制定 IT 战略,以使业务目标与 IT 目标保持一致。公司严重依赖技术,因此 IT 现在是任何强大业务战略的基础部分。..._企业架构师认证
文章浏览阅读5.9k次,点赞2次,收藏29次。相比前两种搭建IP池的方法来说,付费代理IP更能满足用户的需求,但对于有些特殊要求的朋友来说,他们想一次提取很多个或者多次提取很多个,存放在本地建立的IP池里,这种方法在一定的程度上优化了方案。只不过长期下来的话,服务器的维护成本较高,并且需要定时的维护,消耗大量的时间,如果是个人的话,搭建起来后期维护的成本太高了,如果您不是高端玩家的话,不建议使用这种方式搭建IP池。相对于免费的代理IP来说,收费代理IP虽然需要付出一定的成本,但是IP资源都是真实IP,并且高匿性,稳定性也好。一、默认自动切换IP。..._如果制作代理ip池
文章浏览阅读4.3k次,点赞4次,收藏34次。本文主要是总结题主在学习与工作中使用到的Linux环境下解压与压缩命令,内容不算很全,但是囊括了大部分需求场景,如有误笔之处,还请同学指正。_linux解压rpm
文章浏览阅读1.6w次。An unknown error occurred during solution. Check the Solver Output on the Solution Information object for possible causes._an unknown error occurred during solution. check the solver output on the so
文章浏览阅读1.8k次。VUE项目里配置eslint lessless安装 less 和less-loader ,npm install less less-loader --save**修改webpack.base.config.js文件,配置loader加载依赖,让其支持外部的less,在原来的代码上添加 // 此种方法在控制台中标签样式显示的是style标签样式{ test: /\.less$/, loader: "style-loader!css-loader!less-loader",}_eslint less
文章浏览阅读1.4w次,点赞27次,收藏21次。大家好,我是Leo哥,上一节我们通过源码剖析以及图文分析,了解了关于委派筛选器代理和过滤器链代理的原理和作用。这节课我们接着学习SpringSecurity的过滤器,了解SpringSecurity中都有哪些核心过滤器。好了,话不多说让我们开始吧。以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。
文章浏览阅读128次。面试 一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据库或一些基本的算法(二分查找,递归等),公司一般都是测试你的基本功是否扎实,如果你基本功好就游刃有余不必紧张! asp.net面试题 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX()..._.net面试机试题
文章浏览阅读405次。1、官网的文档无论是学习Hadoop的hdfs、hive,还是hbase等,都要非常看重官网的文档。大数据的很多框架,都是Apache的顶级项目,各个组件框架的官网链接都可以从下面的链接进入:Hadoop:http://hadoop.apache.org/Avro: 序列化系统HBase: 分布式数据库Hive: 数据仓库Mahout: 机器学习与数据挖掘库Pig: 并行计算的高级数据..._方法论semma
文章浏览阅读411次,点赞8次,收藏21次。主题模型是自然语言处理和文本挖掘领域的一个重要研究方向,它可以自动发现文档集合中潜在的主题结构。其中,潜在狄利克雷分配(Latent Dirichlet Allocation, LDA)是最常用和最成功的主题模型之一。LDA是一种无监督的贝叶斯概率模型,能够有效地发现文档集合中隐藏的主题结构。LDA模型的核心思想是:每个文档可以表示为多个主题的概率分布,每个主题又可以表示为词语的概率分布。通过学习这些潜在的主题分布和词语分布,LDA模型可以发现文档集合中蕴含的语义主题信息。