java – 使用secp256r1曲线和SHA256算法生成ECDSA签名 – BouncyCastle
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用secp256r1曲线和SHA256算法生成ECDSA签名 – BouncyCastle,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2654字,纯文字阅读大概需要4分钟。
内容图文
![java – 使用secp256r1曲线和SHA256算法生成ECDSA签名 – BouncyCastle](/upload/InfoBanner/zyjiaocheng/745/0b19d31c108447daa59a436ced36f2be.jpg)
我正在尝试使用带有secp256r1曲线(P256)的ECDSA和用于消息散列的SHA256算法生成签名.我也在使用Bouncy Castle图书馆.
代码如下,
public class MyTest {
/**
* @param args
*/
public static void main(String[] args) {
new MyTest().getSign();
}
void getSign() {
// Get the instance of the Key Generator with "EC" algorithm
try {
KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
g.initialize(kpgparams);
KeyPair pair = g.generateKeyPair();
// Instance of signature class with SHA256withECDSA algorithm
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
ecdsaSign.initSign(pair.getPrivate());
System.out.println("Private Keys is::" + pair.getPrivate());
System.out.println("Public Keys is::" + pair.getPublic());
String msg = "text ecdsa with sha256";//getSHA256(msg)
ecdsaSign.update((msg + pair.getPrivate().toString())
.getBytes("UTF-8"));
byte[] signature = ecdsaSign.sign();
System.out.println("Signature is::"
+ new BigInteger(1, signature).toString(16));
// Validation
ecdsaSign.initVerify(pair.getPublic());
ecdsaSign.update(signature);
if (ecdsaSign.verify(signature))
System.out.println("valid");
else
System.out.println("invalid!!!!");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
这里使用KeyPair生成密钥对,但根据我的要求,我将使用静态privateKey和公钥.此外,签名验证始终返回false.
需要帮助,我如何拥有静态私钥和验证部分.
解决方法:
累积奖金 – 你的头衔中没有任何问题!
首先,您可能实际上并未使用BouncyCastle. Sun / Oracle Java 7和8现在包括一个EC提供程序(早期版本没有),并且一个arg形式的getInstance使用第一个可用的提供程序,通常是SunEC,除非您或某人更改了提供程序列表.
验证签名:在传递给签名Signature.update()时,将相同的数据传递给验证的Signature.update().字节的字节完全相同.仅将签名值传递给Signature.verify().将PrivateKey.toString()放入数据中是愚蠢的;此值特定于正在运行的Java进程,因此您必须将其发送到接收进程(如果它通常应该是不同的),它将无用且浪费空间.
使用静态密钥:做到这一点.创建一个密钥对并将其存储在某个地方,然后将其读入并使用它.最简单的安全(密码保护)存储是一个Java KeyStore(JKS)文件,但这需要一个证书链(可能是一个虚拟链),这对你自己编码很麻烦;幸运的是,带有-genkeypair的keytool实用程序生成带有虚拟自签名证书的密钥对,而对于-keyalg ec -keysize 256,它使用(非常流行的)secp256r1曲线.还要指定您选择的-alias名称,-keystore文件名,您对虚拟证书的任何名称以及密码.要使用JKS文件中的密钥对:
>使用java.security.KeyStore.getInstance(“JKS”)创建一个商店对象,并将.load(InputStream,char [])传递给文件上的FileInputStream和密码.
>使用.getKey(String alias,char [] password)和强制转换来获取PrivateKey.用于签名.
>使用.getCertificateChain(String alias)[0] .getPublicKey()从第一个(唯一)cert获取PublicKey.用于验证.
内容总结
以上是互联网集市为您收集整理的java – 使用secp256r1曲线和SHA256算法生成ECDSA签名 – BouncyCastle全部内容,希望文章能够帮你解决java – 使用secp256r1曲线和SHA256算法生成ECDSA签名 – BouncyCastle所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。