Получить ECDSAPublicKey, ECDSAPrivate из кодированной строки pem в Dart - PullRequest
0 голосов
/ 26 сентября 2019

1) Как получить ECDSAPublicKey, ECDSAPrivateKey из DER-кодированной строки pem

2) Как выполнить маршал и демаршал ECDSAPublicKey, ECDSAPrivateKey с использованием PKCS8 или PKCS1

3) Я получил ECPublicKey от ECPrivateКак получить ECDSAPublicKey напрямую из строки pem, а не из закрытого ключа

String pemPkString = '''-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6ZuZLImVj3CA2IE3
21G5mOK65KL71ost37cf2wrc7WChRANCAATMME1IAtwwoD53/IBUOY0H+ua6LKHj
yMhGPi/8dPz9h5FMyXHJQmXI3yEmW/tnyIRu6Z8PmAsVvKX8CnSC9fY6
-----END PRIVATE KEY-----''';

String pemPubString = '''-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzDBNSALcMKA+d/yAVDmNB/rmuiyh
48jIRj4v/HT8/YeRTMlxyUJlyN8hJlv7Z8iEbumfD5gLFbyl/Ap0gvX2Og==
-----END PUBLIC KEY-----''';

String msgToSign = "Hai this is test";

var domainParams = new ECDomainParameters("secp256k1");
void main() {
privateKey = parsePrivateKey(pemPkString);
publicKey = publicKeyFromPrivateKey(privateKey);
var privParams = new PrivateKeyParameter(privateKey);
var signParams =
      () => new ParametersWithRandom(privParams, new NullSecureRandom());
generateSignature(new ECDSASigner(), signParams, msgToSign);
var verifyParams = () => new PublicKeyParameter(publicKey);
verifySign(new ECDSASigner(), verifyParams, msgToSign, signature);
}

ECPrivateKey parsePrivateKey(String pemPkString) {
  List<int> encodedPkData = PemCodec(PemLabel.privateKey).decode(pemPkString);
  BigInt d = decodeBigInt(encodedPkData);
  return new ECPrivateKey(d, domainParams);
}

//Get ECPublicKey from ECPrivateKey
ECPublicKey publicKeyFromPrivateKey(ECPrivateKey privateKey) {
  ECPoint Q = privateKey.parameters.G * privateKey.d;
  return new ECPublicKey(Q, privateKey.parameters);
}

void generateSignature(
    Signer signer, CipherParameters params(), String message) {
  signer.reset();
  signer.init(true, params());
  signature =
      signer.generateSignature(sha256.convert(utf8.encode(message)).bytes);
  print("Signature ");
  print(encodeSignatureToPem(signature));
}

void verifySign(Signer signer, CipherParameters params(), String message,
    Signature signature) {
  signer.reset();
  signer.init(false, params());
  var ok = signer.verifySignature(
      sha256.convert(utf8.encode(message)).bytes, signature);

  print("Verified $ok");
}
String encodeSignatureToPem(ECSignature signature) {
  var topLevel = new ASN1Sequence();
  topLevel.add(ASN1Integer(signature.r));
  topLevel.add(ASN1Integer(signature.s));

  var dataBase64 = base64Encode(topLevel.encodedBytes);
  return dataBase64;
}
...