我已经编写了Python版本的转换方法,但我不知道如何编写Rust版本,
Rust不能使用openssl包编写
我查询的数据,它似乎是可用的k256="0.13.1" der = "0.7.5"
替换
目前已知的公钥是Vec类型的,我不知道如何将公钥从SEC1编码转换为ASN.1 DER编码
下面是我实现的部分代码
use der::{Encoder, Length};
use k256::elliptic_curve::sec1::{ToEncodedPoint, FromEncodedPoint};
use k256::{PublicKey, EncodedPoint};
use der::asn1::{BitString, ObjectIdentifier};
fn sec1_to_der(sec1_key: &[u8]) -> Result<Vec<u8>, der::Error> {
// Load the SEC1-encoded ECDSA public key as the public key object
let public_key = PublicKey::from_sec1_bytes(sec1_key).expect("error");
// Define the OID for secp256k1 (1.3.132.0.10)
let secp256k1_oid: ObjectIdentifier = k256::pkcs8::ObjectIdentifier::new("1.3.132.0.10");
// TODO: How to serialize SEC1-encoded ECDSA to ASN.1 DER format here
}
fn main() {
let der_encoded_public_key:Vec<u8> = vec![3, 89, 191, 147, 51, 6, 188, 19, 231, 106, 80, 5, 56, 106, 114, 19, 115, 17, 94, 22, 217, 162, 205, 241, 154, 223, 129, 72, 143, 27, 102, 251, 246];;
let der_key = sec1_to_der(&der_encoded_public_key);
match der_key {
Ok(der_key) => {
println!("{:?}", der_key);
}
Err(e) => {
println!("{:?}", e);
}
}
}
编辑:预期结果(见评论):
[48, 86, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0, 10, 3, 66, 0, 4, 89, 191, 147, 51, 6, 188, 19, 231, 106, 80, 5, 56, 106, 114, 19, 115, 17, 94, 22, 217, 162, 205, 241, 154, 223, 129, 72, 143, 27, 102, 251, 246, 250, 38, 107, 239, 240, 74, 233, 61, 164, 22, 115, 130, 240, 115, 219, 245, 176, 223, 219, 226, 248, 174, 2, 113, 126, 158, 15, 175, 50, 83, 25, 191]
2条答案
按热度按时间qni6mghb1#
在您的代码中,
use der::{Encoder...
,Encoder
不存在于der
crate上。您可以将公钥从SEC1编码转换为ASN.1 DER编码:main.rs
文件:其输出为:
Cargo.toml
文件:bvuwiixz2#
发布的示例密钥是一个压缩的公钥,将以X.509/SPKI格式导出为ASN.1/DER编码的公钥。
导入可以使用
k256::PublicKey::from_sec1_bytes()
(如前所述),导出可以使用k256::pkcs8::EncodePublicKey::to_public_key_der()
。请注意,没有必要指定曲线(或OID),因为crate k256对于曲线secp 256 k1是 * 显式 * 的。
示例实现: