数字签名API使用

来源:互联网 发布:马斯克人工智能 编辑:程序博客网 时间:2024/04/30 23:40

直接上代码:


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


}
0 0
原创粉丝点击