Java 3DES ECB NoPadding-程序员宅基地

技术标签: 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λ�

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nwdyibao/article/details/45510911

智能推荐

浏览器前端 javascript可以获取客户端的信息_浏览器获取客户端基本信息-程序员宅基地

文章浏览阅读1k次。var appName = navigator.appName; //浏览器的正式名称 var appVersion = navigator.appVersion; //浏览器的版本号 var cookieEnabled = navigator.cookieEnabled; // 返回用户浏览器是否启用了..._浏览器获取客户端基本信息

(最终)如何利用印象笔记搭建自己的知识体系_印象笔记建立个人知识体系-程序员宅基地

文章浏览阅读1k次。1、 为什么要记录笔记这个问题我印象中探讨过很多次,但是简单来讲就是方便日后在遇到相似问题时查询解决方式,并在记录笔记的过程汇总中对知识进行一轮新的复习。这样一生,如果作为一个技术人员来讲的话,我不可能只学习一门技能,需要学习的东西很多。当只会一门技能时,做不做笔记其实无所谓,但是当你学会多种技能时,你需要笔记这样一个第二大脑来帮助存储那些琐碎并不通用的知识,你自己的大脑来记忆通用性的知识,可以迁移的方法。在遇到问题时,知道做什么永远比怎么做更重要。1.1 知识的分类1.1.1 元认知解释:能指导_印象笔记建立个人知识体系

FATFS文件系统详解-程序员宅基地

文章浏览阅读2.7k次,点赞13次,收藏96次。随着硬盘/flash容量不断增大,存储的数据也越来越多,早期单一的对应地址存放对应数据的方案已经无法满足我们的需求,因此一群大佬们便开始设计文件系统这样一个东西,用来管理硬盘/flash上的数据信息。本文主要分享关于FAT文件系统的详细设计。通过对FAT文件系统组成介绍,字段分析并采用新增文件实践分析的方式,详细阐述FAT文件系统的工作原理!_fatfs

【企业架构师】12 项企业架构师认证-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏7次。企业架构师是使 IT 战略与业务目标保持一致的重要且不断增长的角色。无论您对云、应用程序、软件还是系统感兴趣,企业架构认证都可以提升您的职业生涯。如果您计划从事企业架构师 (EA) 的职业,那么认证是验证您的 EA 技能的好方法。作为 EA,您将负责为企业制定 IT 战略,以使业务目标与 IT 目标保持一致。公司严重依赖技术,因此 IT 现在是任何强大业务战略的基础部分。..._企业架构师认证

如何构建一个自己的代理ip池_如果制作代理ip池-程序员宅基地

文章浏览阅读5.9k次,点赞2次,收藏29次。相比前两种搭建IP池的方法来说,付费代理IP更能满足用户的需求,但对于有些特殊要求的朋友来说,他们想一次提取很多个或者多次提取很多个,存放在本地建立的IP池里,这种方法在一定的程度上优化了方案。只不过长期下来的话,服务器的维护成本较高,并且需要定时的维护,消耗大量的时间,如果是个人的话,搭建起来后期维护的成本太高了,如果您不是高端玩家的话,不建议使用这种方式搭建IP池。相对于免费的代理IP来说,收费代理IP虽然需要付出一定的成本,但是IP资源都是真实IP,并且高匿性,稳定性也好。一、默认自动切换IP。..._如果制作代理ip池

Linux下解压与压缩命令_linux解压rpm-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏34次。本文主要是总结题主在学习与工作中使用到的Linux环境下解压与压缩命令,内容不算很全,但是囊括了大部分需求场景,如有误笔之处,还请同学指正。_linux解压rpm

随便推点

ANSYS错误提示:An unknown error occurred during solution. Check the Solver Output on the Solution ...-程序员宅基地

文章浏览阅读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

VUE项目里配置eslint less-程序员宅基地

文章浏览阅读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

SpringSecurity6 | 核心过滤器-程序员宅基地

文章浏览阅读1.4w次,点赞27次,收藏21次。大家好,我是Leo哥,上一节我们通过源码剖析以及图文分析,了解了关于委派筛选器代理和过滤器链代理的原理和作用。这节课我们接着学习SpringSecurity的过滤器,了解SpringSecurity中都有哪些核心过滤器。好了,话不多说让我们开始吧。以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

面试ASP.NET程序员的笔试题和机试题-程序员宅基地

文章浏览阅读128次。面试 一般会叫你填两个表 1个是你的详细信息表 1个是面试题答卷 两个都要注意反正面是否都有内容不要遗漏,如果考你机试一般也有两种,就是程序连接数据库或一些基本的算法(二分查找,递归等),公司一般都是测试你的基本功是否扎实,如果你基本功好就游刃有余不必紧张! asp.net面试题 1.new有几种用法 第一种:new Class(); 第二种:覆盖方法 public new XXXX()..._.net面试机试题

【二、大数据环境篇】001、方法论_方法论semma-程序员宅基地

文章浏览阅读405次。1、官网的文档无论是学习Hadoop的hdfs、hive,还是hbase等,都要非常看重官网的文档。大数据的很多框架,都是Apache的顶级项目,各个组件框架的官网链接都可以从下面的链接进入:Hadoop:http://hadoop.apache.org/Avro: 序列化系统HBase: 分布式数据库Hive: 数据仓库Mahout: 机器学习与数据挖掘库Pig: 并行计算的高级数据..._方法论semma

LDA算法的数学推导过程详解-程序员宅基地

文章浏览阅读411次,点赞8次,收藏21次。主题模型是自然语言处理和文本挖掘领域的一个重要研究方向,它可以自动发现文档集合中潜在的主题结构。其中,潜在狄利克雷分配(Latent Dirichlet Allocation, LDA)是最常用和最成功的主题模型之一。LDA是一种无监督的贝叶斯概率模型,能够有效地发现文档集合中隐藏的主题结构。LDA模型的核心思想是:每个文档可以表示为多个主题的概率分布,每个主题又可以表示为词语的概率分布。通过学习这些潜在的主题分布和词语分布,LDA模型可以发现文档集合中蕴含的语义主题信息。

推荐文章

热门文章

相关标签