DSA 私钥签名,公钥验签

public static final String ALGORITHM = "DSA";/*** 默认密钥字节数* <pre>* DSA* Default Keysize 1024* Keysize must be a multiple of 64, ranging from 512 to 1024 (inclusive).* </pre>*/private static final int KEY_SIZE = 1024;/*** 默认种子*/private static final String DEFAULT_SEED = "0f22507a10bbddd07d8a3082122966e3";private static final String PUBLIC_KEY = "DSAPublicKey";private static final String PRIVATE_KEY = "DSAPrivateKey";/*** 用私钥对信息生成数字签名* @param data*            加密数据* @param privateKey*            私钥* @return* @throws Exception*/public static String sign(byte[] data, String privateKey) throws Exception {// 解密由base64编码的私钥byte[] keyBytes = decryptBASE64(privateKey);// 构造PKCS8EncodedKeySpec对象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 取私钥匙对象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 用私钥对信息生成数字签名Signature signature = Signature.getInstance(keyFactory.getAlgorithm());signature.initSign(priKey);signature.update(data);return encryptBASE64(signature.sign());}/*** BASE64解密* @param key* @return* @throws Exception*/public static byte[] decryptBASE64(String key) throws Exception {return (new BASE64Decoder()).decodeBuffer(key);}/*** BASE64加密* @param key* @return* @throws Exception*/public static String encryptBASE64(byte[] key) throws Exception {return (new BASE64Encoder()).encodeBuffer(key);}/*** 校验数字签名* @param data*            加密数据* @param publicKey*            公钥* @param sign*            数字签名* @return 校验成功返回true 失败返回false* @throws Exception*/public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {// 解密由base64编码的公钥byte[] keyBytes = decryptBASE64(publicKey);// 构造X509EncodedKeySpec对象X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);// ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 取公钥匙对象PublicKey pubKey = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(keyFactory.getAlgorithm());signature.initVerify(pubKey);signature.update(data);// 验证签名是否正常return signature.verify(decryptBASE64(sign));}/*** 生成密钥* @param seed*            种子* @return 密钥对象* @throws Exception*/public static Map<String, Object> initKey(String seed) throws Exception {KeyPairGenerator keygen = KeyPairGenerator.getInstance(ALGORITHM);// 初始化随机产生器SecureRandom secureRandom = new SecureRandom();secureRandom.setSeed(seed.getBytes());keygen.initialize(KEY_SIZE, secureRandom);KeyPair keys = keygen.genKeyPair();DSAPublicKey publicKey = (DSAPublicKey) keys.getPublic();DSAPrivateKey privateKey = (DSAPrivateKey) keys.getPrivate();Map<String, Object> map = new HashMap<String, Object>(2);map.put(PUBLIC_KEY, publicKey);map.put(PRIVATE_KEY, privateKey);return map;}/*** 默认生成密钥** @return 密钥对象* @throws Exception*/public static Map<String, Object> initKey() throws Exception {return initKey(DEFAULT_SEED);}/*** 取得私钥** @param keyMap* @return* @throws Exception*/public static String getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return encryptBASE64(key.getEncoded());}/*** 取得公钥** @param keyMap* @return* @throws Exception*/public static String getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return encryptBASE64(key.getEncoded());}public static void main(String[] args) throws Exception {String inputStr = "abc";byte[] data = inputStr.getBytes();// 构建密钥Map<String, Object> keyMap = initKey();// 获得密钥String publicKey = getPublicKey(keyMap);String privateKey = getPrivateKey(keyMap);System.err.println("公钥:\r" + publicKey);System.err.println("私钥:\r" + privateKey);// 产生签名String sign = sign(data, privateKey);System.err.println("签名:\r" + sign);// 验证签名boolean status = verify(data, publicKey, sign);System.err.println("状态:\r" + status);}

java实现DSA签名、验签相关推荐

  1. Windows gmssl生成SM2证书 + java bc库签名验签

    Windows gmssl生成SM2证书 + java bc库签名验签 openssl生成SM2证书 1 生成密钥 gmssl ecparam -genkey -name sm2p256v1 -tex ...

  2. 【可食用】KeyTool生成KeyStore,证书、公钥、私钥文档JAVA生成,JAVA实现ECC签名验签

    KeyTool生成KeyStore,证书.公钥.私钥文档JAVA生成,JAVA实现ECC签名验签 一.首先我们可以写个工具类生成密钥对.证书.公钥.私钥文本 jksAndCerGenerator.ja ...

  3. Java 实现RSA 签名/验签与加密解密

    文章目录 一.前言 二.签名与验签 1.程序代码如下: 2.程序运行结果: 三.加密解密 1.添加加解密方法 2.程序运行结果 一.前言 RSA 算法相比于AES算法不同的是RSA的秘钥为不同的两个一 ...

  4. ECDSA数字签名算法(java实现ECDSA签名验签)

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  5. java基础-RSA签名验签

    一.介绍 RSA加密是一种非对称加密.可以在不直接传递密钥的情况下,完成解密.这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险.是由一对密钥来进行加解密的过程,分别称为公钥和私钥.两者之 ...

  6. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

  7. java 国密p7验签_go/Java 国密sm2签名验签

    近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项 1 关于密钥对 密钥生成可以使用openssl库,openssl版本至少是1.1.1 ...

  8. js rsa验签_js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  9. 国密SM9算法C++实现之五:签名验签算法

    SM9算法C++实现系列目录: 基于JPBC的SM9算法的java实现与测试 国密SM9算法C++实现之0:源码下载地址 国密SM9算法C++实现之一:算法简介 国密SM9算法C++实现之二:测试工具 ...

  10. 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...

    在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...

最新文章

  1. 【XStream】XStream 忽略不重要点元素
  2. golang学习之旅:使用go语言操作mysql数据库(自己测试了)
  3. C++ volatile关键字说明
  4. C# 8中的Async Streams
  5. 前端学习(1115):call apply bind的区别
  6. ddns客户端_DDNS哪家最方便?试试看Mikrotik的ROS!
  7. Java字符串indexOf(int ch,int fromIndex)方法,带示例
  8. 大数据开发:剖析Hadoop和Spark的Shuffle过程差异
  9. 单纯形表的matlab输出,自编MATLAB版单纯性算法 可以列出单纯形表以及其他相关数据...
  10. 函数防抖(debounce)和节流(throttle)以及lodash的debounce源码赏析
  11. 新增页和列表页遇到的坑
  12. Spring核心内容
  13. 人工智能AI对客户服务的影响正在形成
  14. python之Srcapy框架浅谈
  15. 转载:王垠·程序员的心理疾病
  16. 备战双十一,你清楚积分兑换系统运营吗
  17. php 获取文章内容首图,关于文章的首图及图片版权问题
  18. 看完小i机器人诉苹果,惊呼这也行?
  19. 独家对话AAAI、ACM、ACL三会会士Raymond J. Mooney | 香侬专栏
  20. Linux九阴真经之无影剑残卷2(磁盘存储和文件系统)

热门文章

  1. Linux wifi自动连接脚本
  2. 数据库(笔记)——候选码、主码、外码以及关系的完整性
  3. python智力问答游戏_Python语言编写智力问答小游戏功能
  4. 有关积分的不等式证明
  5. 30个必备英文免费手写字体下载
  6. linux:线程同步的5种方法
  7. 概论第7章_参数估计_点估计的评价标准_相合性_无偏性_有效性
  8. 线性代数(二十四) : 行列式的展开式—拉普拉斯公式
  9. python中安装gensim包
  10. Aspose.Words实用教程:如何处理文档分段——Aspose.Words中的分段