欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java加解密及加解签

程序员文章站 2022-03-04 15:38:15
...

在上篇博文中介绍了获取公私钥的方法: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);
    }

 

 

 

相关标签: 加解密 加解签