我试图用ECDSA和secp256r1曲线(P256)和SHA256算法来生成签名。我也在使用弹力城堡图书馆。下面的代码,
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();
}
}
}
头奖-没有任何在你的标题是一个问题!
首先,您可能实际上并没有使用BouncyCastle。Sun/Oracle Java7和8现在包括一个EC提供程序(早期版本没有),并且GetInstance
的one-arg形式使用第一个可用的提供程序,通常是SunEC,除非您或某人更改了提供程序列表。
要验证签名:向验证signature.update()
传递与向签名signature.update()
传递相同的数据。完全一样,字节对字节。只将签名值传递给signature.verify()
。将privatekey.tostring()
放入数据是愚蠢的;这个值是特定于正在运行的Java进程的,所以您必须将它发送到接收进程(如果不同,通常应该是这样),在那里它是无用的,而且浪费空间。
使用.getkey(字符串别名,char[]password)
和强制转换来获取privatekey。用于签名。
使用.getCertificateChain(字符串别名)[0].getPublicKey()
从第一个(仅有)证书中获取公钥。用于验证。
我正在使用secp256r1曲线和使用BouncyCastle的SHA256算法实现ECDSA签名生成。 对于某些输入,签名长度为127个字符。我感觉开头的“0”被删除了,因为签名被存储到ECDSASigner类中的BigInteger datatype中。 我使用确定性方法添加了rfc6979 ECDSA签名中的示例 唯一的区别是r值中的零。因为签名的长度只有127。 如果我的推论是正确的,请让
下面是我的场景--我从条形码中读取数据,并将其转换为纯文本。本文是条码数据+数字签名的结合。数字签名附加在末尾,使我能够分离出实际数据和数字签名数据。数字签名数据使用sha256哈希-用户将公钥作为windows证书文件()发送给我。 所需实现:-需要从证书中提取公钥,并根据提供的条形码数据和数字签名验证公钥。 问题:
问题内容: 我正在尝试实现ECDSA(椭圆曲线数字签名算法),但是在Java中找不到使用Bouncy Castle的示例。我创建了密钥,但是我真的不知道我应该使用哪种功能来创建签名并进行验证。 问题答案: owlstead是正确的。要详细说明,您可以执行以下操作: 并验证:
我应该如何更改A方法?任何想法都是好的。提前谢谢。
我能够使用带RSA私钥的bouncy castle和“SHA256withRSA”算法对证书进行签名。我使用下面的链接作为参考来实现这一点。使用Bouncy Castle签署CSR 现在我有椭圆曲线密钥与ECDSA签署我的CA。因此,我想通过这些CA用EC密钥和“SHA256 with ECDSA”算法签署证书。然而,我被困在下面的片段特定于RSA密钥,我想使用EC密钥。 请帮助我如何使用ECDS
我有代码使用为ECDSA签名生成串联(r-s)签名和JWK格式的密钥: 似乎有效。我也有使用来实现相同目标的代码: 这两者都返回128字节的缓冲区;并且它们可以交叉验证(例如,我可以用< code>SubtleCrypto验证< code > JSR sign 签名,反之亦然)。然而,当我在Node.js 模块中使用< code>Sign类时,我似乎得到了完全不同的东西。 在这里,我得到了一个可变