在上篇博文中介绍了获取公私钥的方法:http://cc-weige.iteye.com/blog/2381184。
本篇介绍加解密及加解签。
jdkapi提供了两个类javax.crypto.Cipher和java.security.Signature,这两个类是JCE框架的重要基础部分。
1:加密及解密的基本逻辑如下:
1:根据key的算法类型获取一个cipher实例 Cipher c = Cipher.getInstance(key.getA); 2:调用init方法初始化cipher c.init(Cipher.ENCRYPT_MODE/Cipher.DECRYPT_MODE ,key) 3:调用doFinal方法执行加密或者解密 byte[] b = c.doFinal(data, begin, end);
在使用RSA加解密是需要主要到RSA对待加解密的字段数组的长度限制。RSA支持的加密最大字节数:证书位数/8 -11;解密的最大字节数:证书位数/8 。
分段加解密如下:
byte[] encryAndDecry(Key key, byte[] data , int mode){ int encryptblock = 117 ; int decryptblock = 128 ; Cipher cipher = Cipher.getInstance(key.getAlgorithm()); cipher.init(mode, key); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] cache ; int offSet = 0; int i=0; int block = mode == 2 ? decryptblock : encryptblock ; while (inputLen - offSet > 0) { if (inputLen - offSet > block) { cache = cipher.doFinal(data, offSet, block); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * block; } return out.toByteArray(); }
2:加解签使用的是Signature类中方法:sign()和verify(byte[] signature)
javadoc中给出的流程如下:
//签名 //get一个签名对象 Signature signature = Signature.getInstance("使用的算法"); //使用私钥key初始化签名对象,用于签名 signature.initSign(key); //更新签名对象 signature.update(str.getBytes(charset)); //获取签名字节数组 byte[] by = signature.sign(); //解签byte[] sign //get一个签名对象 Signature signature = Signature.getInstance("使用的算法"); //使用公钥key验证签名对象 signature.initVerify(key); //更新签名对象 signature.update(data); //解签sign ,返回一个boolean 值 signature.verify(sign)
java的加解签只要使用的是Signature这个类的api。
java8支持的加解签可以使用的算法有这些:
private final static Map<String,Boolean> signatureInfo; static { signatureInfo = new ConcurrentHashMap<String,Boolean>(); Boolean TRUE = Boolean.TRUE; // pre-initialize with values for our SignatureSpi implementations signatureInfo.put("sun.security.provider.DSA$RawDSA", TRUE); signatureInfo.put("sun.security.provider.DSA$SHA1withDSA", TRUE); signatureInfo.put("sun.security.rsa.RSASignature$MD2withRSA", TRUE); signatureInfo.put("sun.security.rsa.RSASignature$MD5withRSA", TRUE); signatureInfo.put("sun.security.rsa.RSASignature$SHA1withRSA", TRUE); signatureInfo.put("sun.security.rsa.RSASignature$SHA256withRSA", TRUE); signatureInfo.put("sun.security.rsa.RSASignature$SHA384withRSA", TRUE); signatureInfo.put("sun.security.rsa.RSASignature$SHA512withRSA", TRUE); signatureInfo.put("com.sun.net.ssl.internal.ssl.RSASignature", TRUE); signatureInfo.put("sun.security.pkcs11.P11Signature", TRUE); }
相关推荐
PGP 加解密及签名验签示例
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
spring框架中关于RSA sha-256加密解密,加签验签工具类
Rsa加解签,通过对方的公钥解密,用自己的私要加密
Java RSA 加密/解密/签名 工具类 Java RSA 加密/解密/签名 工具类 Java RSA 加密/解密/签名 工具类
C# 基于BouncyCastle.Crypto 1.8.10 实现国密算法,SM2,SM3,SM4(加签解签,加密解密)
ECC算法 C++实现 加解密 已经过测试
sm2国密算法加解密,签名、验签QT工具的源代码(包含sm2,sm3和sm4源码)。 环境我使用的QT5.14的IDE编译,其他版本qt未测试。不过仅使用了几个简单控件应该关系不大。 详细介绍参见个人博客:SM2 (含SM3、SM4)国密...
练习
是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。 二、RSA...
三山国王灵签老爷签文及批文解签诗-17页.pdf
> 一个适用于微信小程序的RSA签名库。 ...使用 1、引入文件 var RSA = require('../../utils/wxapp_rsa.js') 2、调用 var privateKey_pkcs1 = '-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQCk7WKdggwBOtteLL5sPom8...
本文实例讲述了Python下实现的RSA加密/解密及签名/验证功能。分享给大家供大家参考,具体如下: 原文是py2环境,而我的环境是py3,所以对原代码做了修改:decode(), encode() import rsa # 生成密钥 (pubkey, ...
妈祖灵签解签全文,天后灵签解签.doc
黄大仙灵签总共有一百支,按照吉凶可以分为下面五种:上上灵签三支、上吉灵签十二支、中吉灵签三十支、中平灵签三十七支、下下灵签十八支。黄大仙灵签每支签都有其特殊的意义。
国密智能卡业内人士实战生产工具,保证可用好用.支持生成SM2密钥对,签名.解签,PBOC签名,PBOC解签,PBOC算哈希hash,SM3双哈希;Sm4的CBC加密解密,ECB加密解密,计算CBC的MAC,功能全面,性能可靠.
SCV Cryptomanger,可用于验证各种加解密算法、签名解签算法、哈希认证、密钥对生成及转换……编程小帮手啊~开发者一定是个大牛
IOS-RSA-ObjectC,iOS验签RSA加密和验签。工具中使用的是SHA1加签、解签。如果需要其他加签解签,可以修改代码中参数。
签密者(发送方)签密一段消息给解签密者(接收方);接收方能成功解密当且仅当接收方的属性集合与发送方所用的加密属性集合的交集元素的个数大于k,接收方能确定签名是来自发送方当且仅当发送方的属性集合和发送方...
实现一个简单的验证功能,试现了可以怎能MD5的加密算法。RSA的加签解签