Java加密与解密的艺术~数字签名~ECDSA实现

 

ECDSA 实现

/*** 2009-10-10*/
package org.zlex.chapter09_3;import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import java.security.Signature;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECFieldFp;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
import java.security.spec.EllipticCurve;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;import org.bouncycastle.jce.provider.BouncyCastleProvider;/*** ECDSA安全编码组件* * @author 梁栋* @version 1.0* @since 1.0*/
public abstract class ECDSACoder {/*** 数字签名 密钥算法*/private static final String KEY_ALGORITHM = "ECDSA";/*** 数字签名 签名/验证算法* * Bouncy Castle支持以下7种算法* NONEwithECDSA * RIPEMD160withECDSA * SHA1withECDSA* SHA224withECDSA * SHA256withECDSA * SHA384withECDSA * SHA512withECDSA*/private static final String SIGNATURE_ALGORITHM = "SHA512withECDSA";/*** 公钥*/private static final String PUBLIC_KEY = "ECDSAPublicKey";/*** 私钥*/private static final String PRIVATE_KEY = "ECDSAPrivateKey";/*** 初始化密钥* * @return Map 密钥Map* @throws Exception*/public static Map<String, Object> initKey() throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());BigInteger p = new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839");ECFieldFp ecFieldFp = new ECFieldFp(p);BigInteger a = new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc",16);BigInteger b = new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a",16);EllipticCurve ellipticCurve = new EllipticCurve(ecFieldFp, a, b);BigInteger x = new BigInteger("110282003749548856476348533541186204577905061504881242240149511594420911");BigInteger y = new BigInteger("869078407435509378747351873793058868500210384946040694651368759217025454");ECPoint g = new ECPoint(x, y);BigInteger n = new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307");ECParameterSpec ecParameterSpec = new ECParameterSpec(ellipticCurve, g,n, 1);// 实例化密钥对儿生成器KeyPairGenerator kpg = KeyPairGenerator.getInstance(KEY_ALGORITHM);// 初始化密钥对儿生成器kpg.initialize(ecParameterSpec, new SecureRandom());// 生成密钥对儿KeyPair keypair = kpg.generateKeyPair();ECPublicKey publicKey = (ECPublicKey) keypair.getPublic();ECPrivateKey privateKey = (ECPrivateKey) keypair.getPrivate();// 封装密钥Map<String, Object> map = new HashMap<String, Object>(2);map.put(PUBLIC_KEY, publicKey);map.put(PRIVATE_KEY, privateKey);return map;}/*** 取得私钥* * @param keyMap*            密钥Map* @return byte[] 私钥* @throws Exception*/public static byte[] getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return key.getEncoded();}/*** 取得公钥* * @param keyMap*            密钥Map* @return byte[] 公钥* @throws Exception*/public static byte[] getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return key.getEncoded();}/*** 签名* * @param data*            待签名数据* @param privateKey*            私钥* @return byte[] 数字签名* @throws Exception*/public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 转换私钥材料PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);// 实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取私钥匙对象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 实例化SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 初始化Signaturesignature.initSign(priKey);// 更新signature.update(data);// 签名return signature.sign();}/*** 校验* * @param data*            待校验数据* @param publicKey*            公钥* @param sign*            数字签名* @return boolean 校验成功返回true 失败返回false* @throws Exception* */public static boolean verify(byte[] data, byte[] publicKey, byte[] sign)throws Exception {// 加入BouncyCastleProvider支持Security.addProvider(new BouncyCastleProvider());// 转换公钥材料X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);// 实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 生成公钥PublicKey pubKey = keyFactory.generatePublic(keySpec);// 实例化SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 初始化Signaturesignature.initVerify(pubKey);// 更新signature.update(data);// 验证return signature.verify(sign);}
}

ECDSA 示例

/*** 2008-6-11*/
package org.zlex.chapter09_3;import static org.junit.Assert.*;import java.util.Map;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.junit.Before;
import org.junit.Test;/*** ECDSA数字签名校验* * @author 梁栋* @version 1.0*/
public class ECDSACoderTest {/*** 公钥*/private byte[] publicKey;/*** 私钥*/private byte[] privateKey;/*** 初始化密钥* * @throws Exception*/@Beforepublic void initKey() throws Exception {Map<String, Object> keyMap = ECDSACoder.initKey();publicKey = ECDSACoder.getPublicKey(keyMap);privateKey = ECDSACoder.getPrivateKey(keyMap);System.err.println("公钥: \n" + Base64.encodeBase64String(publicKey));System.err.println("私钥: \n" + Base64.encodeBase64String(privateKey));}/*** 校验* * @throws Exception*/@Testpublic void test() throws Exception {String inputStr = "ECDSA 数字签名";byte[] data = inputStr.getBytes();// 产生签名byte[] sign = ECDSACoder.sign(data, privateKey);System.err.println("签名:\r" + Hex.encodeHexString(sign));// 验证签名boolean status = ECDSACoder.verify(data, publicKey, sign);System.err.println("状态:\r" + status);assertTrue(status);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Science:语言可能并不是推理能力所必需的

来源&#xff1a;神经科技丨公众号在一项新的针对婴儿的研究中&#xff0c;来自西班牙、匈牙利和波兰的研究人员发现语言可能并不是推理能力&#xff08;reasoning ability&#xff09;所必需的。在发表在2018年3月16日的Science期刊上的一篇标题为“Precursors of logical rea…

嗅探工具 --- wireshark、tcpdump、dsniff、ettercap、bettercap、netsniff-ng、cain

最好的 MitM 中间人攻击开源框架清单&#xff1a;https://github.com/Chan9390/Awesome-MitM 哔哩哔哩&#xff1a;https://search.bilibili.com/all?keywordwireshark 1、WireShark WireShark 是一个开源免费的高性能网络协议分析软件&#xff0c;它的前身就是非常著名的网络…

AjaxPro.dll和AjaxPro.2.dll的web配置方法

在<system.web>节点下配置<httpHandlers><add verb"POST,GET" path"ajaxpro/*.ashx" type"AjaxPro.AjaxHandlerFactory, AjaxPro"/></httpHandlers>2.AjaxPro.2.dll在web.config中的配置如下&#xff1a;在<system.w…

JavaScript抽象类及Class.create备忘

我们知道抽象在面向对象中的重要地位。而JavaScript虽不是一门户严格意义上的面向对象语言&#xff0c;但&#xff0c;它也可以有自己的面向对象实现。当然包括抽象。在JavaScript中,虚方法可以看作该类中没有定义的方法,但已经通过this指针使用了.通过下面的示例可以看出&…

人工脑连接体:类脑人工智能的奇点时刻来临

来源&#xff1a;华春雷科学网博客最近&#xff0c;Mindputer实验室制造出世界首个“人工脑连接体”&#xff08;True-Brain&#xff09;的信息刚刚发布&#xff08;详见《会议通报&#xff1a;中国Mindputer实验室首次造出人工脑连接体》。做为一个高前沿性的专业技术概念&…

python列表用来有序存放一组_python入门第二课------列表

1. 列表可以用来存储字符&#xff0c;数字等信息在geany(文本编辑器也可以直接在python终端输入)里输入以下内容&#xff1a;equipment[train,car,plane] /* equipment是列表的名称&#xff0c;中括号内是列表的元素print(equipment) /*输出列表内…

电脑、手机 自动化 键鼠操作( 类似按键精灵 )

有没有和按键精灵类似的脚本软件 &#xff1f;&#xff1f;&#xff1a;https://www.zhihu.com/question/342937346 AutomateIt、Automate、按键精灵、AutoJS…等Android自动化工具有什么特点&#xff1f;&#xff1a;https://www.zhihu.com/question/59503646 按键精灵系列软…

Java加密与解密的艺术~数字证书详解

数字证书具备常规加密/解密必要的信息&#xff0c;包含签名算法&#xff0c;可用于网络数据加密/解密交互&#xff0c;标识网络用户&#xff08;计算机&#xff09;身份。数字证书为发布公钥提供了一种简便的途径&#xff0c;其数字证书则成为加密算法以及公钥的载体。依靠数字…

Learn X in Y minutes

From : http://geek.csdn.net/news/detail/125208 Learn X in Y minutes&#xff1a;https://learnxinyminutes.com/ learnxinyminutes.com&#xff0c;这是一个由社区驱动的语言风暴网站&#xff0c;含有很多语言的快速入门和示例&#xff0c;能够让你在短短几分钟之内了解一…

学界 | DeepMind论文解读:通过删除神经元来了解深度学习

作者&#xff1a;杨文深度神经网络由许多单独的神经元组成&#xff0c;它们以复杂且违反人直觉的方式组合起来&#xff0c;以解决各种具有挑战性的任务。这种复杂性一方面赋予神经网络神秘力量&#xff0c;另一方面&#xff0c;也让它们变成了人类难懂的黑匣子。了解神经网络的…

python动态验证码_Python 模拟生成动态产生验证码图片的方法

模拟动态产生验证码图片模拟生成验证码&#xff0c;首先要做的是生成随机的字母&#xff0c;然后对字母进行模糊处理。这里介绍一下 Python 提供的 Pillow 模块。PillowPIL&#xff1a;Python Image Library&#xff0c;Python 的图像处理标准库&#xff0c;功能强大。PIL 是第…

图解 CSS (1): 先做一个样式表测试工具

一直没有把样式表系统一下, 春节假期有空, 不能再等了.为了方便学习, 先写了一个样式表测试工具: CssTest(点击下载)工具非常简单, 写了 10 行左右的代码; 运行效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, …

Java加密与解密的艺术~数字证书~模型分析

1、证书签发 数字证书需要经由认证机构签发&#xff0c;其流程如图&#xff1a; 数字证书的颁发流程可简述为如下过程&#xff1a; 1&#xff09;、由数字证书需求方产生自己的密钥对。 2&#xff09;、由数字证书需求方将算法、公钥和证书申请者身份信息传送给认证机构。…

公告!2018年度国家科技奖提名公示,信息科学组获47项提名

作者&#xff1a;杨文3 月 23 日&#xff0c;国家科学技术奖励工作办公室发布第 89 号公告&#xff1a;2018 年度国家科学技术奖提名工作已结束&#xff0c;共收到有关单位和专家提名的国家自然科学奖项目 272 项&#xff0c;技术发明奖项目 306 项 (通用项目 247 项&#xff0…

Python 虚拟环境

参考&#xff1a;http://www.cnblogs.com/wilber2013/p/4774022.html virtualenv documentation: https://virtualenv.pypa.io/en/latest/ virtualenvwrapper documentation: http://virtualenvwrapper.readthedocs.org/en/latest/http://docs.python-guide.org/en/latest/dev/…

mesos marathon mysql_Mesos和Marathon简介

Mesos是apache的开源项目&#xff0c;是使用C开发的资源管理框架。假设我们的数据中心有众多的服务器&#xff0c;这些服务器要运行业务程序&#xff0c;业务程序随着业务规模的增加往往需要扩容&#xff0c;在运维层面会遇到的问题是&#xff0c;运维无法准确把握资源分配是否…

5.4. Interaction Between Devices and Kernel 设备与内核的交互

目录&#xff1a;http://www.cnblogs.com/WuCountry/archive/2008/11/15/1333960.html [不提供插图&#xff0c;读者最好从网上下载源书] 5.4. Interaction Between Devices and Kernel 设备与内核的交互Nearly all devices (including NICs) interact with the kernel in …

Java加密与解密的艺术~数字证书~证书管理

证书管理 keytool命令 echo 生成本地数字证书1 keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias www.zlex.org -keystore zlex.keystore -storepass 123456echo 生成本地数字证书2 keytool -genkeypair -keyalg RSA -keysize 2048…

VR变革已来!华为完成业界首个5G实验网下Cloud VR业务验证

来源&#xff1a;智吧网近日&#xff0c;华为、北京传送科技有限公司&#xff08;TPCAST&#xff09;联合完成业界首个5G实验网下Cloud VR业务验证&#xff0c;实现了交互式CG&#xff08;Computer Graphics&#xff09;VR内容的实时云端渲染。何以见得这足以被历史铭记&#x…

mysql中when用法_Mysql 中的CASE WHEN 用法

在SELECT语句查询中可以使用CASE WHEN对查询出来的结果&#xff0c;进行一个类似于if else的判断。具体的用法1.SELECT a.website_id, b.customer_name, a.website_enddate, c.member_name, d.websitetype_id,CASEWHEN d.websitetype_id1 THEN 400WHEN d.websitetype_id2 THEN …