java解签_java加解密及加解签

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

static {

signatureInfo = new ConcurrentHashMap();

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值