JAVA加密解密之DSA(Digital Signature Algorithm)算法
来源:互联网 发布:九九乘法表 java 编辑:程序博客网 时间:2024/06/06 02:41
DSA算法简介
DSA-Digital Signature Algorithm是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。数字签名,是单向加密的升级!
DSA算法实现
package com.jianggujin.codec;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;/** * DSA * * @author jianggujin * */public class HQDSA{ private static HQDSA dsa = new HQDSA(); public static HQDSA getInstance() { return dsa; } private HQDSA() { } /** * DSA签名算法 * * @author jianggujin * */ public static enum HQDSASignatureAlgorithm { DSA("DSA"), SHA1withDSA("SHA1withDSA"), SHA224withDSA("SHA224withDSA"), SHA256withDSA("SHA256withDSA"); private String name; private HQDSASignatureAlgorithm(String name) { this.name = name; } public String getName() { return this.name; } } public static final String ALGORITHM = "DSA"; public byte[] sign(byte[] data, byte[] privateKey, HQDSASignatureAlgorithm signatureAlgorithm) throws Exception { return sign(data, privateKey, signatureAlgorithm.getName()); } public byte[] sign(byte[] data, byte[] privateKey, String signatureAlgorithm) throws Exception { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey); KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); Signature signature = Signature.getInstance(signatureAlgorithm); signature.initSign(priKey); signature.update(data); return signature.sign(); } public boolean verify(byte[] data, byte[] publicKey, byte[] sign, HQDSASignatureAlgorithm signatureAlgorithm) throws Exception { return verify(data, publicKey, sign, signatureAlgorithm.getName()); } public boolean verify(byte[] data, byte[] publicKey, byte[] sign, String signatureAlgorithm) throws Exception { X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey); KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); PublicKey pubKey = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(signatureAlgorithm); signature.initVerify(pubKey); signature.update(data); return signature.verify(sign); } /** * 初始化密钥 * * @return */ public HQKeyPair initKey() throws Exception { return initKey(1024); } /** * 初始化密钥 * * @param keySize * @return */ public HQKeyPair initKey(int keySize) throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGORITHM); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); return new HQKeyPair(keyPair); }}
测试代码:
import org.junit.Test;import com.jianggujin.codec.HQBase64;import com.jianggujin.codec.HQDSA;import com.jianggujin.codec.HQDSA.HQDSASignatureAlgorithm;import com.jianggujin.codec.HQKeyPair;public class DSATest{ HQDSA dsa = HQDSA.getInstance(); HQBase64 base64 = HQBase64.getInstance(); @Test public void encode() throws Exception { byte[] data = "jianggujin".getBytes(); HQKeyPair keyPair = dsa.initKey(); HQDSASignatureAlgorithm[] algorithms = HQDSASignatureAlgorithm.values(); for (HQDSASignatureAlgorithm algorithm : algorithms) { System.err.println("========================================="); System.err.println(algorithm); byte[] sign = dsa.sign(data, keyPair.getPrivateKey(), algorithm); System.err.println("签名:" + base64.encodeToString(sign)); System.err.println("验签:" + dsa.verify(data, keyPair.getPublicKey(), sign, algorithm)); } }}
测试结果: =========================================
DSA
签名:MC0CFQCRt2xFSIBJ/XSPHGYmSHhTOCjkwAIUSn8r6egiLg/d+Puq/AjE+IPGEvE=
验签:true =========================================
SHA1withDSA
签名:MCwCFGOsJKBaGWXR5QA+YK3Z/QQ2li/LAhRQLQM3BFmM9B2jjyxrBUaO11xqVA==
验签:true =========================================
SHA224withDSA
签名:MCwCFANthkgvsQ/zMFDUlkfMiv386bszAhRJCOvQI5LKRuvZdoyOOomNy2R7RA==
验签:true =========================================
SHA256withDSA
签名:MCwCFH/IFt1WfO/y6cRAX2GHaA0PkqoSAhRVHgecDEVkXmuZwePvfeLuU/3lqA==
验签:true
- JAVA加密解密之DSA(Digital Signature Algorithm)算法
- 第四十八篇:JAVA加密解密之DSA(Digital Signature Algorithm)算法
- 加密解密---------->DSA算法
- java 加密解密算法MD5/SHA1,DSA
- java 加密解密算法MD5/SHA1,DSA
- Bitcoin学习篇之---Elliptic Curve Digital Signature Algorithm(椭圆曲线数字签名算法)
- java安全架构____java DSA加密解密
- java之加密解密算法
- 【密钥算法】Java加密技术(六)---DSA 数字签名算法
- JAVA加密解密之凯撒加密(Caesar cipher)算法
- Java加密技术(六)——数字签名算法DSA
- Java加密技术(六)——数字签名算法DSA
- Java加密技术(六)——数字签名算法DSA
- Java加密技术(六)——数字签名算法DSA
- Java加密技术(六)——数字签名算法DSA
- Java加密技术(六)——数字签名算法DSA
- Java加密技术(六)——数字签名算法DSA
- Java加密技术(六)——数字签名算法DSA
- 售票问题
- IT技术学习指导之Linux系统入门的4个阶段
- 【POJ 2001 Shortest Prefixes】+ 字典树
- 使用fsdbdebug抽取fsdb文件中的信号列表
- HBase插入和读取图片
- JAVA加密解密之DSA(Digital Signature Algorithm)算法
- storm
- hdu4339query
- 关于老赵让改成bootstrap框架搭建的过程
- OpenGL之路(一)OpenGL、gl、glu、glut的区别 + glut环境的搭建
- hive数据倾斜原因和解决方法
- Matlab代码迁移至C++(上)
- 搭建react native mac 环境
- 你好OI,蒟蒻的第一篇博客