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;它的前身就是非常著名的网络…

JavaScript抽象类及Class.create备忘

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

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

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

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

有没有和按键精灵类似的脚本软件 &#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;其数字证书则成为加密算法以及公钥的载体。依靠数字…

学界 | 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/…

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

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

预测|十张图带你了解2018年机器人行业趋势与前景

来源&#xff1a;前瞻产业研究院3月15日&#xff0c;腾讯对外公布了其2018年在AI领域的三大核心战略&#xff0c;其中包括成立机器人实验室“Robotics X”。当然&#xff0c;腾讯并不是唯一一家展开行动的互联网巨头&#xff0c;“三巨头”中的另外两家——百度和阿里&#xff…

python mro c3_Python 19 MRO和C3算法

1.python经典类的MRO经典类的MROclass A: pass class B(A): pass class C(A): pass class D(B, C): pass class E: pass class F(D, E): pass class G(F, D): pass class H: pass class Foo(H, G): passenter description here2. python新式类的MRO, C3算法新式类的MROclass A:…

Java加密与解密的艺术~安全协议~模型分析

模型分析 1、协商算法 RNC&#xff1a;Random Number Client RNS&#xff1a;Random Number Server 2、验证证书 3、产生密钥 PMS&#xff1a;Pre-Master Secret&#xff08;预备主密钥&#xff09; MS&#xff1a;Master Secret&#xff08;主密钥&#xff09; 4、加密交互

漫天风口,一地泡沫,消费机器人四年跌宕史

来源&#xff1a;OFweek 作者&#xff1a;邹大湿提及科技浪潮&#xff0c;AI 和机器人是逃不过的。2018年&#xff0c;AI依旧很火&#xff0c;但几年前曾经燥热的机器人狂潮&#xff0c;似乎凉凉了&#xff1f;那个曾经宣称万亿市场的智能机器人&#xff0c;究竟怎么了&#…

Python操作RabbitMQ

来源&#xff1a;http://www.cnblogs.com/phennry/p/5713274.html 本篇博客主要介绍如何通过Python来操作管理RabbitMQ消息队列&#xff0c;大家在工作中可能遇到很多类似RabbitMQ这种消息队列的中间件&#xff0c;如&#xff1a;ZeroMQ、ActiveMQ、MetaMQ等&#xff0c;我们学…

分享-利用VPC防止病毒软件的进入你的windows电脑

作为一个软件爱好者时不时都会从网上下载一些软件使用&#xff0c;虽然&#xff0c;现在防病毒和木马软件做得很好&#xff0c;但也架不住众多病毒木马的攻击。 所以&#xff0c;我的经验是当我下载一个软件以后&#xff0c;无法判定是否是病毒木马的话&#xff0c;我会安装在虚…

无监督学习最新研究:通过简单的「图像旋转」预测便可为图像特征学习提供强大监督信号

作者&#xff1a;Spyros Gidaris、Praveer Singh、Nikos Komodakis「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA在过去的几年中&#xff0c;深度卷积神经网络&#xff08;ConvNets&#xff09;已经改变了计算机视觉的领域&#xff0c;这是由于它们具有学习高级语义…