久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何從 EC 公鑰字節中獲取 PublicKey 對象?

How can I get a PublicKey object from EC public key bytes?(如何從 EC 公鑰字節中獲取 PublicKey 對象?)
本文介紹了如何從 EC 公鑰字節中獲取 PublicKey 對象?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在開發一個應用程序,該應用程序需要在 secp256r1(NIST P-256、P-256、prime256v1)公鑰的幫助下驗證 SHA256withECDSA簽名.p>

公鑰由不同的應用程序在較早的某個時間點生成,并以十六進制編碼存儲在我的數據庫中.這里的十六進制字符串的格式等同于 OpenSSL 在對文件 x.pem 調用 openssl ec -in x.pem -noout -text 時生成的十六進制字符串之前由 openssl ecparam -genkey -name secp256r1 -out x.pem 生成.消息和簽名是從不同的應用程序接收的.考慮以下測試數據:

//存儲在數據庫中byte[] pubKey = DatatypeConverter.parseHexBinary("049a55ad1e210cd113457ccd3465b930c9e7ade5e760ef64b63142dad43a308ed08e2d85632e8ff0322d3c7fda14409eafdc4c5b8ee0882fe885c92e//從其他應用程序接收字節[]消息= DatatypeConverter.parseHexBinary( 54686973206973206a75737420736f6d6520706f696e746c6573732064756d6d7920737472696e672e205468616e6b7320616e7977617920666f722074616b696e67207468652074696d6520746f206465636f6465206974203b2d29");字節[]簽名= DatatypeConverter.parseHexBinary( 304402205fef461a4714a18a5ca6dce6d5ab8604f09f3899313a28ab430eb9860f8be9d602203c8d36446be85383af3f2e8630f40c4172543322b5e8973e03fff2309755e654");

現在這個應該是一個有效的簽名.

我的目標是使用 Java 和/或 Bouncycastle 加密 API 驗證消息上的簽名.我為此創建了一個方法 isValidSignature:

private static boolean isValidSignature(byte[] pubKey, byte[] message,byte[] 簽名)拋出 NoSuchAlgorithmException、NoSuchProviderException、InvalidKeyException、SignatureException、InvalidKeySpecException {簽名 ecdsaVerify = Signature.getInstance("SHA256withECDSA", new BouncyCastleProvider());ecdsaVerify.initVerify(getPublicKeyFromHex(pubKey));ecdsaVerify.update(消息);返回 ecdsaVerify.verify(簽名);}

我已嘗試提取公鑰:

KeyFactory.generatePublic:

private static PublicKey getPublicKeyFromHex(byte[] pubKey) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException {KeyFactory 事實 = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());return fact.generatePublic(new X509EncodedKeySpec(pubKey));}

但這會引發 java.security.spec.InvalidKeySpecException(DER 長度超過 4 個字節:26).我該怎么做才能解析這個?

解決方案

Bouncy Castle 橢圓曲線密鑰對生成和密鑰工廠示例代碼讓我非常接近.

一旦我設法為 secp256r1/NIST P-256/P-256/創建了 ECDSA 密鑰工廠和曲線規范prime256v1 曲線 我能夠使用 ECPointUtil.decodePoint 來獲得曲線點.然后我可以生成一個公鑰規范,使我能夠生成這樣的公鑰:

private PublicKey getPublicKeyFromBytes(byte[] pubKey) throws NoSuchAlgorithmException, InvalidKeySpecException {ECNamedCurveParameterSpec 規范 = ECNamedCurveTable.getParameterSpec("prime256v1");KeyFactory kf = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());ECPoint 點 = ECPointUtil.decodePoint(params.getCurve(), pubKey);ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);ECPublicKey pk = (ECPublicKey) kf.generatePublic(pubKeySpec);返回PK;}

I am developing an application that needs to validate SHA256withECDSAsignatures with the help of secp256r1 (NIST P-256, P-256, prime256v1) public keys.

The public keys are generated by a different application at some earlier point in time and stored in my database in hex encoding. The format of the hex string here is equivalent to the hex string OpenSSL would generate when calling openssl ec -in x.pem -noout -text on a file x.pem that has previously been generated by openssl ecparam -genkey -name secp256r1 -out x.pem. The message and signature are received from a different application. Consider the following test data:

// Stored in Database
byte[] pubKey = DatatypeConverter.parseHexBinary("049a55ad1e210cd113457ccd3465b930c9e7ade5e760ef64b63142dad43a308ed08e2d85632e8ff0322d3c7fda14409eafdc4c5b8ee0882fe885c92e3789c36a7a");

// Received from Other Application
byte[] message = DatatypeConverter.parseHexBinary("54686973206973206a75737420736f6d6520706f696e746c6573732064756d6d7920737472696e672e205468616e6b7320616e7977617920666f722074616b696e67207468652074696d6520746f206465636f6465206974203b2d29");
byte[] signature = DatatypeConverter.parseHexBinary("304402205fef461a4714a18a5ca6dce6d5ab8604f09f3899313a28ab430eb9860f8be9d602203c8d36446be85383af3f2e8630f40c4172543322b5e8973e03fff2309755e654");

Now this should be a valid signature.

My objective is to validate the signature over the message using the Java and/or Bouncycastle crypto API. I have created a method isValidSignaturefor that:

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(getPublicKeyFromHex(pubKey));
    ecdsaVerify.update(message);
    return ecdsaVerify.verify(signature);
}

I have tried to extract the public key:

KeyFactory.generatePublic:

private static PublicKey getPublicKeyFromHex(byte[] pubKey) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException {
    KeyFactory fact = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
    return fact.generatePublic(new X509EncodedKeySpec(pubKey));
}

But this throws a java.security.spec.InvalidKeySpecException (DER length more than 4 bytes: 26). What can I do to parse this?

解決方案

The Bouncy Castle example code on elliptic curve key pair Generation and key factories got me pretty close.

Once I managed to create a ECDSA key factory and a curve specification for the secp256r1/NIST P-256/P-256/prime256v1 curve I was able to use ECPointUtil.decodePoint to obtain a curve point. I could then generate a public key specification that enabled me to generate a public key like this:

private PublicKey getPublicKeyFromBytes(byte[] pubKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
    ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
    KeyFactory kf = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
    ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());
    ECPoint point =  ECPointUtil.decodePoint(params.getCurve(), pubKey);
    ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);
    ECPublicKey pk = (ECPublicKey) kf.generatePublic(pubKeySpec);
    return pk;
}

這篇關于如何從 EC 公鑰字節中獲取 PublicKey 對象?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How to wrap text around components in a JTextPane?(如何在 JTextPane 中的組件周圍環繞文本?)
MyBatis, how to get the auto generated key of an insert? [MySql](MyBatis,如何獲取插入的自動生成密鑰?[MySql])
Inserting to Oracle Nested Table in Java(在 Java 中插入 Oracle 嵌套表)
Java: How to insert CLOB into oracle database(Java:如何將 CLOB 插入 oracle 數據庫)
Why does Spring-data-jdbc not save my Car object?(為什么 Spring-data-jdbc 不保存我的 Car 對象?)
Use threading to process file chunk by chunk(使用線程逐塊處理文件)
主站蜘蛛池模板: 九九热最新视频 | 999热精品视频 | 99免费在线 | 亚洲天堂久久新 | 成人美女免费网站视频 | 国产高清一区二区三区 | 国产精品久久久久久久模特 | 亚州精品天堂中文字幕 | 香蕉国产在线视频 | 国产高清一区 | 欧美日韩亚洲一区 | jlzzjlzz国产精品久久 | 一道本视频 | 日本三级电影在线看 | 久久久久久成人 | av中文字幕网 | 日韩一区二区三区在线视频 | 成人精品一区 | 红色av社区 | 国产综合久久 | 欧美天堂 | 免费观看一级特黄欧美大片 | 激情的网站 | 精品综合视频 | 久久精品一区二区三区四区 | 丁香六月伊人 | 欧美日韩在线一区二区 | 无码国模国产在线观看 | 亚洲欧美日韩一区二区 | 九九热精品在线视频 | 日韩欧美视频 | 欧美激情va永久在线播放 | 亚洲 中文 欧美 日韩 在线观看 | 91社区在线观看高清 | 中文字幕视频在线观看 | 久久中文字幕一区 | 欧美一区二区三区在线观看视频 | www.亚洲精品 | 久久r久久| 亚洲成人日韩 | 欧美一区在线视频 |