博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数字签名算法
阅读量:6307 次
发布时间:2019-06-22

本文共 2778 字,大约阅读时间需要 9 分钟。

RSA、DSA和ECDSA三种算法。
通常是先对消息做 摘要处理,然后使用 私钥对摘要值进行 签名处理;验证时,使用 公钥验证消息的摘要值。
public 
class 
RSASin {
       
        
private 
static 
final 
String 
KEY_ALGORITHM
= 
"RSA"
;
       
        
public 
static 
final 
String 
SIGNATURE_ALGORITHM
= 
"MD5WithRSA"
;
       
        
private 
static 
final 
String 
PUBLIC_KEY
= 
"RSAPublicKey"
;
        
private 
static 
final 
String 
PRIVATE_KEY
= 
"RSAPrivateKey"
;
        
private 
static 
final 
int 
KEY_SIZE
=512;
       
        
private 
static 
byte
[] 
pubKey
;
        
private 
static 
byte
[] 
priKey
;
       
        
//数字签名,根据私钥获取数字签名
        
public 
static 
byte
[] sign(
byte
[] data, 
byte
[] privateKey) 
throws 
Exception{
               
//私钥规范
              PKCS8EncodedKeySpec pkcs8= 
new 
PKCS8EncodedKeySpec(privateKey);
               
//密钥工厂
              KeyFactory keyFac=KeyFactory. getInstance(
KEY_ALGORITHM
);
              PrivateKey priKey=keyFac.generatePrivate(pkcs8);
               
//实例化Signature
              Signature signature=Signature. getInstance(
SIGNATURE_ALGORITHM
);
               
//初始化
              signature.initSign(priKey);
               
//更新
              signature.update(data); 
//根据数据更新签名
               
//签名
               
return 
signature.sign();
       }
       
       
        
//校验--公钥验证
        
public 
static 
boolean 
verify(
byte
[] data, 
byte
[] publicKey,
byte
[] sign) 
throws 
Exception{
               
//公钥规范
              X509EncodedKeySpec x509= 
new 
X509EncodedKeySpec(publicKey);
              KeyFactory keyFac=KeyFactory. getInstance(
KEY_ALGORITHM
);
               
//生成公钥
              PublicKey pubKey=keyFac.generatePublic(x509);
              
              Signature signature=Signature. getInstance(
SIGNATURE_ALGORITHM
);
              signature.initVerify(pubKey);
              signature.update(data);
               
//验证
               
return 
signature.verify(sign);
       }
       
        
//取得私钥
        
public 
static 
byte
[] getPrivateKey(Map<String,Object> keyMap){
              Key key=(Key) keyMap.get( 
PRIVATE_KEY
);
               
return 
key.getEncoded();
       }
       
        
//公钥
        
public 
static 
byte
[] getPublicKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get( 
PUBLIC_KEY
);
               
return 
key.getEncoded();
       }
       
        
//初始化密钥对
        
public 
static 
Map<String,Object> initKey() 
throws 
Exception{
              KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance( 
KEY_ALGORITHM
);
              keyPairGen.initialize( 
KEY_SIZE
);
               
//生成密钥对
              KeyPair keyP=keyPairGen.generateKeyPair();
               
//公钥
              RSAPublicKey publicKey=(RSAPublicKey)keyP.getPublic();
               
//私钥
              RSAPrivateKey privateKey=(RSAPrivateKey)keyP.getPrivate();
               
//封装密钥
              Map<String,Object> keyMap= 
new 
HashMap<String,Object>(2);
              keyMap.put( 
PRIVATE_KEY
, (Object) privateKey);
              keyMap.put( 
PUBLIC_KEY
, (Object) publicKey);
               
return 
keyMap;
       }
       
        
public 
static 
final 
void 
main(String[] args) 
throws 
Exception{
              Map<String,Object> kMap= initKey();
               
pubKey
=getPublicKey(kMap);
               
priKey
=getPrivateKey(kMap);
              System. 
err
.println(
"公钥:\n" 
+Base64.encodeBase64String (
pubKey 
));
              System. 
err
.println(
"私钥:\n" 
+Base64.encodeBase64String (
priKey 
));
              
              String str= 
"RSA数字签名" 
;
               
byte
[] data=str.getBytes();
              
               
//产生签名
               
byte
[] sign=sign(data, 
priKey
);
              System. 
err
.println(
"签名:\n" 
+Hex.encodeHexString (sign));
              
               
//验证签名
               
boolean 
status=verify(data, 
pubKey
, sign);
              System. 
err
.println(
"状态:\n" 
+status);
              
               
//验证
               assertTrue(status);
       }
}

转载于:https://www.cnblogs.com/littlefishxu/p/3969187.html

你可能感兴趣的文章
如何学习虚拟现实技术vr? vr初级入门教程开始
查看>>
第4 章序列的应用
查看>>
Mysql explain
查看>>
初识闭包
查看>>
java tcp socket实例
查看>>
011 指针的算术运算
查看>>
hdu1874畅通工程续
查看>>
rails 字符串 转化为 html
查看>>
java-学习8
查看>>
AOP动态代理
查看>>
Oracle序列
查看>>
xcodebuild命令行编译错误问题解决
查看>>
Yii2.0 下的 load() 方法的使用
查看>>
华为畅玩5 (CUN-AL00) 刷入第三方twrp Recovery 及 root
查看>>
LeetCode----67. Add Binary(java)
查看>>
母版页 MasterPage
查看>>
[转] ReactNative Animated动画详解
查看>>
DNS原理及其解析过程
查看>>
记录自写AFNetWorking封装类
查看>>
没想到cnblog也有月经贴,其实C#值不值钱不重要。
查看>>