Tag: ecdsa

ECDSA签名Java vs Go

我正在尝试学习一些Go和区块链。从ECDSA签名开始。 试图弄清楚如何测试我是否有正确工作的ECDSA签名的Go实现,我想我会尝试在Java中创建一个类似的版本并比较结果,看看我是否可以让它们匹配。 所以Java尝试: public static void main(String[] args) throws Exception { //the keys below are previously generated with “generateKey();” and base64 encoded generateKey(); String privStr = “MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCAQ7bMVIcWr9NpSD3hPkns5C0qET87UvyY5WI6UML2p0Q==”; String pubStr = “MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAES8VdACZT/9u1NmaiQk0KIjEXxiaxms74nu/ps6bP0OvYMIlTdIWWU2s35LEKsNJH9u5QM2ocX53BPjwbsENXJw==”; PrivateKey privateKey = base64ToPrivateKey(privStr); PublicKey publicKey = base64ToPublicKey(pubStr); String str = “This is string to sign”; byte[] signature = signMsg(str, privateKey); boolean ok = […]

在充气城堡中生成ECDSA私钥会返回PUBLIC密钥

我试图使用充气城堡来生成ECDSA密钥。 代码似乎从Java的角度来看很好; 但是,当我转储文件并尝试validation数据时,OpenSSL不喜欢数据的格式。 经过一番研究,我认为充气城堡正在将私钥编码为公钥。 这是我的Java代码: public class Test { public static void main(String[] args) { Security.addProvider(new BouncyCastleProvider()); System.out.println(“Starting…”); String name = “prime256v1”; try { KeyPairGenerator kpg = KeyPairGenerator.getInstance(“ECDSA”, BouncyCastleProvider.PROVIDER_NAME); kpg.initialize(new ECGenParameterSpec(name)); KeyPair keyPair = kpg.generateKeyPair(); FileOutputStream writer = new FileOutputStream(“private.key”); writer.write(keyPair.getPrivate().getEncoded()); writer.close(); } catch(Exception e) { e.printStackTrace(); } } } private.key文件以有效的DER格式生成; 但是,当我运行以下命令来查看密钥的ASN.1结构时: $ openssl asn1parse […]

固定长度64字节EC P-256使用JCE签名

我需要一个固定长度的64字节ECDSA签名和NIST P-256曲线。 该实现有使用JCE。 以下代码示例可以生成签名并进行validation。 Provider provSign = new SunEC(); Provider provVerify = new SunEC(); // generate EC key KeyPairGenerator kg = KeyPairGenerator.getInstance(“EC”, provSign); ECGenParameterSpec ecParam = new ECGenParameterSpec(“secp256r1”); kg.initialize(ecParam); KeyPair keyPair = kg.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); try { // export public key KeyFactory kf = KeyFactory.getInstance(“EC”, provSign); ECPublicKeySpec publicKeySpec = […]

C#ecdsa签名 – 我可以选择哪个密钥规范?

我需要在C#端生成一个ECDSA签名,并在使用(显然)相对公钥读取并validationandroid应用程序上的签名。 好吧,要在java中获得ECDSA密钥对(使用充气城堡提供商),代码就是这样 kpg = KeyPairGenerator.getInstance(“ECDSA”, “BC”); ecSpec = new ECGenParameterSpec(“secp224k1”); kpg.initialize(ecSpec, new SecureRandom()); 字符串”secp224k1″是曲线名称。 我可以选择“secp224k1”,“secp224r1”,“secp256k1”,“secp256r1”等等。 我的问题是: 哪个是上面提到的C#中的等效曲线名称? 有人能让我举个例子,在C#中,我可以像上面的java代码一样生成keyPair吗? 提前致谢

使用BouncyCastlevalidationJava中的ECDSA签名时出错

我已经测试了一个解决方案,以validationECDSA签名( 如何从EC公钥字节中获取PublicKey对象? ),它与给定数据完美配合。 这是数据: byte[] pubKey = DatatypeConverter.parseHexBinary(“049a55ad1e210cd113457ccd3465b930c9e7ade5e760ef64b63142dad43a308ed08e2d85632e8ff0322d3c7fda14409eafdc4c5b8ee0882fe885c92e3789c36a7a”); byte[] message = DatatypeConverter.parseHexBinary(“54686973206973206a75737420736f6d6520706f696e746c6573732064756d6d7920737472696e672e205468616e6b7320616e7977617920666f722074616b696e67207468652074696d6520746f206465636f6465206974203b2d29”); byte[] signature = DatatypeConverter.parseHexBinary(“304402205fef461a4714a18a5ca6dce6d5ab8604f09f3899313a28ab430eb9860f8be9d602203c8d36446be85383af3f2e8630f40c4172543322b5e8973e03fff2309755e654”); 这是代码(打印为true ): private static boolean isValidSignature(byte[] pubKey, byte[] message,byte[] signature) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, SignatureException, InvalidKeySpecException { Signature ecdsaVerify = Signature.getInstance(“SHA256withECDSA”, new BouncyCastleProvider()); ecdsaVerify.initVerify(getPublicKeyFromBytes(pubKey)); ecdsaVerify.update(message); return ecdsaVerify.verify(signature); } private static PublicKey getPublicKeyFromBytes(byte[] pubKey) throws NoSuchAlgorithmException, InvalidKeySpecException { ECNamedCurveParameterSpec spec […]

在Java安全性中使用openssh公钥(ecdsa-sha2-nistp256)

是否有一个Java库/示例来读取Java中JCE PublicKey的openssh格式ecdsa PublicKey ? 我想将EC用于JWT 。 我试图读取的格式是按authorized_keys中,或Github的API(如https://api.github.com/users/davidcarboni/keys ): ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK8hPtB72/sfYgNw1WTska2DNOJFx+QhUxuV6OLINSD2ty+6gxcM8yZrvMqWdMePGRb2cGh8L/0bGOk+64IQ/pM= 我找到了这个答案,这对RSA和DSS来说很好: 使用来自使用Java安全性的authorized_keys的公钥 ,以及对ECDSA的openssh格式的讨论: https : //security.stackexchange.com/questions/129910/ecdsa-为什么-DO-SSH-凯基和Java的生成公共密钥具备的,不同的,大小 然而,我迷失了尝试调整ECDSA的RSS / DSA代码 – 我不知道如何设置ECPublicKeySpec 。 它需要ECPoint , EllipticCurve , ECParameterSpec , ECField 。 openssh格式只包含两个整数,这对ECPoint ,但我不知道如何设置其余的。 我一直在寻找一堆库,包括jsch , sshj , ssh-tools和古老的Bouncycastle 。 我最接近的是: com.jcraft.jsch.KeyPair load = com.jcraft.jsch.KeyPair.load(jsch, null, bytes[openSshKey]); 哪个加载密钥很好,但不会让我去JCE PublicKey – 只是一个byte[] getPublicKeyBlob()方法。 我错过了一些明显的东西吗

如何使用海绵城堡为比特币曲线(secp256k1)创建ECDSA密钥对(256位)?

目前,当我使用以下方法创建密钥时 private KeyPair getKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException { KeyPairGenerator keyGen = KeyPairGenerator.getInstance(“ECDsA”, “SC”); ECGenParameterSpec ecSpec = new ECGenParameterSpec(“secp256k1”); keyGen.initialize(ecSpec, new SecureRandom()); return keyGen.generateKeyPair(); } KeyPairGenerator有另一种方法,我可以在其中指定keySize,但我不确定如何通过ecSpec。 public void initialize(int keysize, SecureRandom random)

DER解码Java中的ECDSA签名

我用Java生成了一个ECDSA签名,我想从中获取R和S值。 据我所知,我生成的签名是DER编码的。 有人可以提供一些Java代码(可能使用Bouncy Castle)来检索R和S值为BigIntegers吗? 注意:如果它有帮助,我通过JCE的Signature类使用内置提供程序生成签名,并且我的P_256 EC密钥对的签名长度通常在70到72字节之间。

ECDSA使用BouncyCastle签名并使用Crypto ++进行validation

这是Java代码: public static String sign(String data) throws Exception { KeyPair keyPair = loadKeyPair(System.getProperty(“user.dir”), “ECDSA”); Signature signature = Signature.getInstance(“SHA256withECDSA”, “BC”); signature.initSign(keyPair.getPrivate(), new SecureRandom()); byte[] message = data.getBytes(); signature.update(message); byte[] sigBytes = signature.sign(); String signatureStr = new BigInteger(1, sigBytes).toString(16); return signatureStr; } 然后用C ++代码validation签名 bool VerifyMessage( const ECDSA::PublicKey& key, const string& message, const string& signature ) { […]

在Java中加载原始的64字节长ECDSA公钥

我有一个原始(r,s)格式的ECDSA NIST P-256公钥。 似乎没有简单的方法将它加载到实现java.security.interfaces.ECPublicKey的对象中。 加载64字节公钥的最简洁方法是什么,以便可以用来检查签名?