質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

0回答

1127閲覧

文字列をRSA SHA256で署名したい

marokatsu

総合スコア38

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

1クリップ

投稿2022/12/18 07:44

前提

サイトからダウンロードした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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問