数字签名API使用

直接上代码:


import java.io.IOException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class TestSingature {



public static KeyPair getKeyPair() throws Exception{
        KeyPairGenerator keyPairGenerator = KeyPairGenerator
        .getInstance("RSA");
        keyPairGenerator.initialize(512);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        return keyPair;
}

public static String getPublicKey(KeyPair keyPair){
PublicKey publicKey = keyPair.getPublic();
byte[] bytes = publicKey.getEncoded();
return byte2base64(bytes);

}

public static String getPrivateKey(KeyPair keyPair){
PrivateKey privateKey = keyPair.getPrivate();
byte[] bytes = privateKey.getEncoded();
return byte2base64(bytes);
}

public static PublicKey string2PublicKey(String pubStr) 
throws Exception{
byte[] keyBytes = base642byte(pubStr);
/**
* This class represents the ASN.1 encoding of a public key,
* encoded according to the ASN.1 type
*/
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);  
KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        return publicKey;
}

public static PrivateKey string2PrivateKey(String priStr) 
throws Exception{
byte[] keyBytes = base642byte(priStr);
/**
* This class represents the ASN.1 encoding of a private key,
* encoded according to the ASN.1 type
*/
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
        return privateKey;
}

private static String byte2base64(byte[] bytes){
BASE64Encoder base64Encoder = new BASE64Encoder();
return base64Encoder.encode(bytes);
}
private static byte[] base642byte(String base64) throws IOException{
BASE64Decoder base64Decoder = new BASE64Decoder();
return base64Decoder.decodeBuffer(base64);
}



private static byte[] sign(byte[] content, PrivateKey privateKey ) throws Exception{
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] bytes = md.digest(content);
Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] encryptBytes = cipher.doFinal(bytes);
return encryptBytes;
}

private static boolean verify(byte[] content, byte[] sign, PublicKey publicKey) throws Exception{
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] bytes = md.digest(content);
Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] decryptBytes = cipher.doFinal(sign);
if(byte2base64(decryptBytes).equals(byte2base64(bytes))){
return true;
}else{
return false;
}
}




public static void main(String[] args) throws Exception {

KeyPair keyPair = getKeyPair();
String publicKey =  getPublicKey(keyPair);
String privateKey = getPrivateKey(keyPair);

PublicKey publics = string2PublicKey(publicKey);
PrivateKey privates = string2PrivateKey(privateKey);

String a = "hello,i am chenkangxian,good night!";


byte[] sign = sign(a.getBytes(),privates);
boolean verify = verify(a.getBytes(),sign,publics);

System.out.println(verify);


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值