前提
サイトからダウンロードしたpemファイルを用いて
ある文字列をRSA SHA256で署名したいです。
ダウンロードしたpemファイルは秘密鍵です。
参考サイト
参考にしたサイトは以下となります。
https://qiita.com/y_yoda/items/f4bd3ec56ac7591c5804
発生している問題
参考サイトでは暗号化にパブリックキーが使われていて復元化にプライベートキーが使われています。
今回は秘密鍵を使って署名したいのでソースで使われているメソッドを
プライベートをパブリックにパブリックをプライベートにしました。
しかし、実行したところエラーが発生してしまい解決方法がわかりません。
当方、暗号化についての知見が全くなく今回初めて暗号化について勉強中です。
エラーメッセージ
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'キーがありません。'
該当のソースコード
C#
1public void Main() 2 { 3 //暗号化 4 var privateParameters = CreatePrivateKeyParameters(PrivateKey); 5 var cipherText = Encrypt(privateParameters, "topsecret"); 6 7 //復号化 8 var publicParameters = CreatePublicKeyParameters(PublicKey); 9 var plainText = Decrypt(publicParameters, cipherText); 10 } 11 12 bool RSA暗号鍵の各種パラメータの頭1バイトが0x00だったら除外する { get; set; } = true; 13 14 string Encrypt(RSAParameters parameters, string plainText) 15 { 16 using (var rsa = new RSACryptoServiceProvider()) 17 { 18 rsa.ImportParameters(parameters); 19 var plainBytes = Encoding.UTF8.GetBytes(plainText); 20 var cipherBytes = rsa.Encrypt(plainBytes, RSAEncryptionPadding.Pkcs1); 21 22 return Convert.ToBase64String(cipherBytes); 23 } 24 } 25 26 string Decrypt(RSAParameters parameters, string cipherText) 27 { 28 using (var rsa = new RSACryptoServiceProvider()) 29 { 30 rsa.ImportParameters(parameters); 31 var cipherBytes = Convert.FromBase64String(cipherText); 32 var plainBytes = rsa.Decrypt(cipherBytes, RSAEncryptionPadding.Pkcs1); 33 34 return Encoding.UTF8.GetString(plainBytes); 35 } 36 } 37 38 RSAParameters CreatePublicKeyParameters(string publicKey) 39 { 40 using (var reader = new StringReader(publicKey)) 41 { 42 var pem = new Org.BouncyCastle.Utilities.IO.Pem.PemReader(reader).ReadPemObject(); 43 44 using (var stream = new MemoryStream(pem.Content, false)) 45 { 46 var asn1 = new Asn1InputStream(stream, pem.Content.Length).ReadObject(); 47 var info = SubjectPublicKeyInfo.GetInstance(asn1); 48 var parameters = PublicKeyFactory.CreateKey(pem.Content) as RsaKeyParameters; 49 50 //$"OID:{info.AlgorithmID.Algorithm.Id}".Dump(); 51 52 return new RSAParameters 53 { 54 Exponent = Adjustment(parameters?.Exponent?.ToByteArray()), 55 Modulus = Adjustment(parameters?.Modulus?.ToByteArray()) 56 }; 57 } 58 } 59 } 60 61 RSAParameters CreatePrivateKeyParameters(string privateKey) 62 { 63 using (var reader = new StringReader(privateKey)) 64 { 65 var pem = new Org.BouncyCastle.OpenSsl.PemReader(reader); 66 var keyPair = pem.ReadObject() as AsymmetricCipherKeyPair; 67 var parameters = keyPair?.Private as RsaPrivateCrtKeyParameters; 68 69 return new RSAParameters 70 { 71 D = Adjustment(parameters?.Exponent?.ToByteArray()), 72 DP = Adjustment(parameters?.DP?.ToByteArray()), 73 DQ = Adjustment(parameters?.DQ?.ToByteArray()), 74 Exponent = Adjustment(parameters?.PublicExponent?.ToByteArray()), 75 InverseQ = Adjustment(parameters?.QInv?.ToByteArray()), 76 Modulus = Adjustment(parameters?.Modulus?.ToByteArray()), 77 P = Adjustment(parameters?.P?.ToByteArray()), 78 Q = Adjustment(parameters?.Q?.ToByteArray()), 79 }; 80 } 81 } 82 83 byte[] Adjustment(byte[] bytes) 84 { 85 if (!RSA暗号鍵の各種パラメータの頭1バイトが0x00だったら除外する) 86 { 87 return bytes; 88 } 89 90 if (bytes == null) return bytes; 91 92 if (bytes.Length > 0 && bytes[0] == 0x00) 93 { 94 var offset = 1; 95 var size = bytes.Length - offset; 96 var buffer = new byte[size]; 97 Buffer.BlockCopy(bytes, offset, buffer, 0, size); 98 return buffer; 99 } 100 101 return bytes; 102 } 103 104 //CMD:openssl genrsa > private-key.pem 105 const string PrivateKey = @"-----BEGIN RSA PRIVATE KEY----- 106MIICXAIBAAKBgQC7Np2qTFhnZD0meg7OqzPMLzQjZLhCjLpmVoeTPAaeTpvQij0r 107EG9FmS+Gbj4oGBiV8BaOraWlRTmPh2DnJJv/WmsAmd+WRsbCowGfpmukG7X0bEp7 108XIRvbwzTHV34X3JyWdq9eGyr6FjidyiMPnA+sBRuvJhvsf4kmadrHIGXuQIDAQAB 109AoGACJHfdcQ458K26eP8eYlsvZQLlvMtXB6FCdo8Kok85FJE3670Tdxau5zfiA/T 1102JIBzhtHbRCV3JLmp6NS1EHgwiOVgohrzLj2QME+pN05Kxs+d8snfyl+izmuluV/ 1114qfOEcq1q3BiKI5jjrF78vVJzkRJNN/xLDxfk+duXYxnHeECQQDoQCcVGRKThyDp 112cD/flayKf0ejtfKFZieTkOcKmU5zNdACDu7QgvcgwA2emu/cH/yFIExzPcg6vAXc 113cXAg6CLTAkEAzlt6zfaLfGGeWrp+2W+J9svrc060ckeFRzDHiwWA/T3c/F1fjCDs 114B2qouZuRWxSQJ5XTro4uKRvd+GjBZxALwwJAC5+qVRP8KgYJT6WejMIg8I2OOFNS 1153/pM4MXPymgB1SJMVs4IhccIN0tlYxq+BnZTXRZQvTPKYaYnZPEIe50ioQJBALe0 116mrvWu1BsexPcKOcbM+Ago6gQLfX6k7zPwSSTLsTDmQKVgWT3PghQPIqX4qwJv1du 117O3ePHar9IvttDpfYog8CQAMy9RiFqJ3K/St4iVZizsoeG/GAa+o/kKiTjK4+wnox 118UdkJEZh/7lkKbw9h2CVURIjUitmKDrfjkeJ7GsdKvAM= 119-----END RSA PRIVATE KEY-----"; 120 121 //CMD:openssl rsa -pubout < private-key.pem > public-key.pem 122 const string PublicKey = @"-----BEGIN PUBLIC KEY----- 123MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7Np2qTFhnZD0meg7OqzPMLzQj 124ZLhCjLpmVoeTPAaeTpvQij0rEG9FmS+Gbj4oGBiV8BaOraWlRTmPh2DnJJv/WmsA 125md+WRsbCowGfpmukG7X0bEp7XIRvbwzTHV34X3JyWdq9eGyr6FjidyiMPnA+sBRu 126vJhvsf4kmadrHIGXuQIDAQAB 127-----END PUBLIC KEY-----";
補足情報(FW/ツールのバージョンなど)
.NET 6.0
Visual Studio 2022 Professional
あなたの回答
tips
プレビュー