前言:近期公司做数据加密及签名,整理如下:

一、数字签名。

是只有信息的发送者才能产生的别人无法伪造的一段数字串,具有不可抵赖性,可验证信息完整性的一种手段。

签名不可伪造:其他人因为没有对应的私钥,所以没法生成公钥可以解密的密文,所以是不可伪造的。

过程为:

1.A对消息M计算摘要,得到摘要H(可以采用MD5,因为MD5具有唯一性且不可逆)。

2.A利用自己的私钥对H进行签名得到Sign(即加密,可以采用RSA)

二、消息加密

可采用DESede算法进行加密,需要获取密钥对。

三、消息加密,并进行签名

1.A生成消息M。

2.利用MD5加密M生成摘要H(就是生成16字节的散列值)。

3.利用A的私钥(因为私钥保护的好是不可能外露的,加密后的消息是不可能被其他公钥解密的)对H进行加密,生成签名Sign。

4.将M通过DESede进行加密,生成加密消息R。

5.将Sign和R进行Base64编码后发送给B。

四、解密

1.解密消息R,生成原文P。

2.利用A的公钥解密签名Sign生成B。

3.对P进行MD5加密,并与B进行比较,如果一致说明没有被修改过。

五、代码(以下代码已验证)

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import kh.pms.tools.StringUtil; /**
* 签名验签及加密 1.对原文进行des加密。 2.des加密数据进行md5。 3.用我方私钥进行md5的签名。 4.用我方公钥对des加密数据进行加密
*
* @author chx
*
*/
public class MD5withRSA {
private static final String FLAG_RSA = "RSA";
private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
/**
* 我方私钥对象
*/
private PrivateKey myPrivateKeyObj; /**
* 银行方公钥对象
*/
private PublicKey bankPublicKeyObj; /**
* 获取签名
*
* @return
* @throws Exception
*/
public byte[] getSign(String str) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 签名的算法
signature.initSign(myPrivateKeyObj);
signature.update(str.getBytes());
return signature.sign();
} /**
* 析构函数
*
* @param plain
* 待加解密原文
* @throws Exception
*/
public MD5withRSA() throws Exception {
myPrivateKeyObj = getPrivateKey();
      //将此处的JianHangUtil.bankPublicKey更换为自己的公钥字符串(base64格式),后面的
bankPublicKeyObj = getPublicKey(JianHangUtil.bankPublicKey);
} /**
* 通过预制公钥生成PublicKey
*
* @param pubKey
* @return
* @throws Exception
*/
private PublicKey getPublicKey(String key) throws Exception {
byte[] encoded = StringUtil.getBaseStrJie(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
KeyFactory factory = KeyFactory.getInstance(FLAG_RSA);
return factory.generatePublic(keySpec);
} /**
* 将指定的字符串转换为私钥key
*
* @param priKey
* @return
* @throws Exception
*/
private PrivateKey getPrivateKey() throws Exception {
// 首先进行base64解码。
byte[] encoded = StringUtil.getBaseStrJie(JianHangUtil.myPrivateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory factory = KeyFactory.getInstance(FLAG_RSA);
return factory.generatePrivate(keySpec);
} /**
* 验证签名
*
* @param data
* 原文
* @param mySign
* 签名
* @return
* @throws Exception
*/
public boolean yanZhengSign(byte[] data, byte[] mySign) throws Exception {
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(bankPublicKeyObj);
signature.update(data);
return signature.verify(mySign);
}

加解密:

package kh.pms.bank;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import kh.pms.tools.StringUtil; /**
* 报文加解密工具(注意,本类所有方法均会进行base64解码)
*
* @author chx
*
*/
public class DESedeCoder {
/**
* 密钥算法
*/
private static String KEY_ALGORITHM = "DESede";
private static String DEFAULT_CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding"; /**
* 加密(会对des和公钥进行base64解码)
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return byte[] 加密数据
* @throws Exception
*/
public byte[] encrypt(byte[] src) throws Exception {
DESedeKeySpec dks = new DESedeKeySpec(StringUtil.getBaseStrJie(JianHangUtil.desKey));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, securekey);
return cipher.doFinal(src);
} /**
* 解密
*
* @param data
* 待解密数据
* @param key
* 密钥
* @return byte[] 解密数据
* @throws Exception
*/
public byte[] decrypt(byte[] data) throws Exception {
// 加解密的deskey(需更换为自己的des密钥)
DESedeKeySpec dks = new DESedeKeySpec(StringUtil.getBaseStrJie(JianHangUtil.desKey));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, securekey);
return cipher.doFinal(data);
}
}

Java利用MD5WithRSA签名及DESede加密的更多相关文章

  1. [原创]java WEB学习笔记105:Spring学习---AOP介绍,相关概念,使用AOP,利用 方法签名 编写 AspectJ 切入点表达式

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. 支付宝ios支付请求Java服务端签名报的一个错(ALI40247) 原创

    今天做app的支付宝支付,遇到些问题,以前做支付宝支付签名都是直接在客户端App进行,今天下了最新版本ios的支付宝支付demo,运行demo时底部有红色的显眼字体,告知用户签名必须在服务端进行... ...

  3. C#、Java和JS实现SHA256+BASE64加密总结

    C#.Java和JS实现SHA256+BASE64加密总结 --莫非(www.muphy.me) 原理 首先,通过编码格式(UTF-8.ASCII等,如果含有汉字等字符,编码格式不同加密结果也不同)获 ...

  4. 【转】Java Cipher类 DES算法(加密与解密)

    Java Cipher类 DES算法(加密与解密) 1.加密解密类 import java.security.*; import javax.crypto.*; import java.io.*; / ...

  5. C#实现MD5WITHRSA签名

    这是很久以前的写的一篇博客了,今天把他重新找出来整理一下发布到博客园 当时对接银联的时候搞了很久都没搞出来,后来一个偶然的机会发现类似的一个代码参考了一下终于弄好了 这段代码主要是实现了C#服务端对接 ...

  6. Java三行代码搞定MD5加密

    Java三行代码搞定MD5加密 https://www.dexcoder.com/selfly/article/4026 public class MD5Test { public static vo ...

  7. java利用JDK调用并执行js源码

    前言: 不同开发语言之间具有通用性,更具有协作调用的可能.有时候对于一些场景会有调用js的需求,因此下面展示了一个java利用自身JDK调用js函数的demo,供感兴趣的朋友参考. js函数文件 ex ...

  8. Java利用Preferences设置个人偏好

    Java利用Preferences设置个人偏好 Preferences的中文意思即偏好或喜好的意思,也就是说同一个程序在每次运行完后,可以通过Preferences来记录用户的偏好,下次启动时,程序会 ...

  9. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

随机推荐

  1. Python最快的方式来读取大文本文件(几GB)

    我有一个大文本文件(约7 GB).我正在寻找是否存在阅读大文本文件的最快方法.我一直在阅读有关使用多种方法作为读取chunk-by-chunk以加快进程的过程. 例如,effbot建议 # File: ...

  2. JPA接口整理归纳方法规则

    Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ...

  3. javascript中var同时声明多个变量时的原理是什么?

    <script> function show(){ var a=b=c=d=5; } show(); alert(a);//弹a时报错(not defined),而b.c.d都能弹出5 & ...

  4. cas4.2.7 集群服务搭建

    cas服务端集群,网上资料很多,无非就是session共享,ticket共享. 但是session共享是必须的吗?或者能实现集群吗? 实践: 1. ticket共享,直接上代码 package org ...

  5. java爬取读者文摘杂志

    java爬虫入门实战练习 此代码仅用于学习研究 此次练习选择了读者文摘杂志网站进行文章爬取 练习中用到的都只是一些简单的方法,不过过程中复习了输入流输出流的使用以及文件的创建写入等知识,对自己还是有所 ...

  6. shell变量的间接引用

  7. svnversion - 为工作代码产生一个紧缩的 (compat) 版本号

    SYNOPSIS 总览 svnversion wc_path [trail_url] OVERVIEW 概述 Subversion 是一个版本控制系统,允许保存旧版本的文件和目录 (通常是源代码),保 ...

  8. Codeforces 1111E DP + 树状数组 + LCA + dfs序

    题意:给你一颗树,有q次询问,每次询问给你若干个点,这些点可以最多分出m组,每组要满足两个条件:1:每组至少一个点,2:组内的点不能是组内其它点的祖先,问这样的分组能有多少个? 思路:https:// ...

  9. Tomcat 配置访问限制:访问白名单和访问黑名单

    最近公司的阿里云服务器上配置的 Tomcat 服务器运行 java的环境,但是通过观察 Tomcat 这几天的日志发现,有很多莫名其妙的 IP 访问主机下莫名其妙的地址,如:/80./testprox ...

  10. 获取微信企业的corpID,sercret,access_token,部门设置列表

    获取微信企业的corpID,sercret,access_token,部门设置列表   zabbix调用微信发短信可能用到的一些变量,获取方式如下: 1.corpID(公司ID) 在我的企业--企业信 ...