|
|
|
|
暗号強度 | 公開鍵暗号 RSA暗号方式 鍵ビット長 | 公開鍵暗号 ECDSA暗号方式 (楕円曲線暗号) 鍵ビット長 | 共通鍵暗号 AES暗号方式 鍵ビット長 | SHAハッシュ関数 | HMAC 暗号ハッシュ関数 | 2030年末まで | 2031年以降 |
80以下 (112未満) | 1024 | 160 | 2TDEA | SHA-1 | -- | × Legacy use | × Legacy use |
112 | 2048 | 224 | 3TDEA | SHA-224、SHA-512/224 | -- | ○ | × Legacy use |
128 | 3072 | 256 | AES-128 | SHA-256、SHA-512/256 | SHA-1 | ○ | ○ |
192 | 7680 | 384 | AES-192 | SHA-384 | SHA-224、SHA-512/224 | ○ | ○ |
256 | 15360 | 512 | AES-256 | SHA-512 | SHA-256、SHA-512/256 | ○ | ○ |
RSA暗号方式 鍵ビット長 | 利用期限 | 特定用途での延長 |
1408-bit | 2024年末まで | 2025年末まで |
1984-bit | 2029年末まで | -- |
使い方 | 目的 | 暗号化 | 復号化 | 補足 |
その1 | メッセージの秘匿送信 | 「受信者」の「公開鍵」 | 「受信者」の「秘密鍵」 | 受信者以外は暗号化メッセージを解読できない |
その2 | 自分である事の認証・証明 | 「送信者」の「秘密鍵」 | 「送信者」の「公開鍵」 | 送信者以外は暗号化メッセージを作れない |
![]() ゴルゴ13 (Volume108) 最終暗号 (SPコミックスコンパクト) (日本語) コミック - 2007/9/28 ASIN: 4845830612 |
![]() ゴルゴ13 (129) (SPコミックス) (日本語) コミック - 2003/7/5 ASIN: 4845801299 |
![]() ゴルゴ13 THE LAST CODE〜最終暗号〜 (My first big) (日本語) ムック - 2015/8/7 ASIN: 4091198481 |
![]() 暗号解読(上) (新潮文庫) (日本語) 文庫 - 2007/6/28 ASIN: 410215972X |
PEM形式 = BASE64 + ヘッダ情報 + フッタ情報 DER形式 = バイナリ(PEM形式の BASE64部分と同じ内容) msblob形式 = Windowsプログラムと相性が良い DER形式のバイナリ部分は ASN.1形式で符号化されています。 Abstract Syntax Notation One - ウィキペディア rem 鍵のビット長は 2048 bit長 rem 2048/8 - (3+8) = 245 bytes rem PEM形式で RSAの「秘密鍵」と「公開鍵」を生成 openssl genrsa -out private-key.pem 2048 rem 「公開鍵」は「秘密鍵」を元にして作成 openssl rsa -in private-key.pem -pubout -out public-key.pem rem DER形式で RSAの「秘密鍵」と「公開鍵」を生成 openssl genrsa -out private-key.der -outform der 2048 openssl rsa -in private-key.der -inform DER -pubout -out public-key.der -outform DER rem 「秘密鍵」で PEM形式を DER形式に変換 openssl rsa -in private-key.pem -out private-key.der -outform DER rem PEM形式の「秘密鍵」から DER形式の「公開鍵」を作成 openssl rsa -in private-key.pem -pubout -out public-key.der -outform DER rem 「公開鍵」で PEM形式を DER形式に変換 openssl rsa -pubin -in public-key.pem -pubout -out public-key.der -outform DER rem PEM形式の「秘密鍵」から msblob形式の「秘密鍵」を変換 rem Visual Studio Visual C C#で使う MSBLOB形式 PRIVATEKEYBLOB openssl rsa -in private-key.pem -out private-key.msblob -outform msblob rem PEM形式の「秘密鍵」から msblob形式の「公開鍵」を変換 rem Visual Studio Visual C C#で使う MSBLOB形式 PUBLICKEYBLOB openssl rsa -in private-key.pem -pubout -out public-key.msblob -outform msblob rem PEM形式の「秘密鍵」から msblob形式の「公開鍵」を作成 rem Visual Studio Visual C C#で使う MSBLOB形式 PUBLICKEYBLOB openssl rsa -pubin -in public-key.pem -pubout -out public-key.msblob -outform msblob
PKCS#1 v1.5 Padding方式の場合の暗号化できるデータ長の最大バイト数 RSA/ECB/PKCS1Padding (暗号化できるデータ長の最大バイト数) = (鍵長ビット)/ 8bit - 8 - 3 3は PKCS#1 v1.5 Paddingの固定バイト 8は PKCS#1 v1.5 Paddingの乱数生成の 8バイト ※ PKCS#1 v1.5 Padding方式は元の平文が同じでも暗号化したデータは上記の乱数生成の関係で毎回異なります。 鍵長が 2048bitの場合は 2048bit / 8bit = 256bytes 256bytes - 8bytes - 3bytes = 245bytes となり、暗号化できるデータ長は最大で 245bytesとなります。 245bytes以上のデータを暗号化したい場合は 245bytes毎に分割する必要が有ります。 test_245_bytes.txt 245 bytes test_246_bytes.txt 246 bytes rem 「公開鍵」を使って平文を暗号化 openssl rsautl -encrypt -pubin -inkey public-key.pem -in test_245_bytes.txt -out test_245_bytes.enc 245 bytesなのでエラーが出ないで暗号化処理ができる rem 「公開鍵」を使って平文を暗号化 245バイトを超えているので暗号化できない openssl rsautl -encrypt -pubin -inkey public-key.pem -in test_246_bytes.txt -out test_246_bytes.enc RSA operation error 9276:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:crypto\rsa\rsa_pk1.c:125: 246 bytesなのでエラーが出て暗号化処理ができない rem 「秘密鍵」を使って暗号文を復号化 openssl rsautl -decrypt -inkey private-key.pem -in test_245_bytes.enc -out decode_test_245_bytes.txt 245 bytesの暗号化データをエラーが出ないで復号化処理ができる
Padding無しの RAWの場合は RSAの鍵長が 2048bitの場合は 2048bit / 8bit = 256bytes となり、暗号化できるデータ長は最大で 256bytesとなります。 ※ 実装依存で、最大が 255 bytesの場合も有る test_256_bytes.txt 256 bytes test_257_bytes.txt 257 bytes rem rawの場合 RSA/ECB/NoPadding rem 「公開鍵」を使って平文を暗号化 openssl rsautl -encrypt -pubin -inkey public-key.pem -in test_256_bytes.txt -out test_256_bytes.enc -raw 256 bytesなのでエラーが出ないで暗号化処理ができる rem 「公開鍵」を使って平文を暗号化 256バイトを超えているので暗号化できない openssl rsautl -encrypt -pubin -inkey public-key.pem -in test_257_bytes.txt -out test_257_bytes.enc -raw RSA operation error 11468:error:0406B06E:rsa routines:RSA_padding_add_none:data too large for key size:crypto\rsa\rsa_none.c:18: 257 bytesなのでエラーが出て暗号化処理ができない rem 「秘密鍵」を使って暗号文を復号化 openssl rsautl -decrypt -inkey private-key.pem -in test_256_bytes.enc -out decode_test_256_bytes.txt -raw 256 bytesの暗号化データをエラーが出ないで復号化処理ができる
ハッシュ形式 | ハッシュサイズ | RSA-OAEPでの最大バイト長 (鍵長 = 2048bit = 256bytes) | |
SHA-1 | 20バイト | 256 - 2 - 20*2 = 214 | RSA/ECB/OAEPWithSHA1AndMGF1Padding |
SHA-256 | 32バイト | 256 - 2 - 32*2 = 190 | RSA/ECB/OAEPWithSHA256AndMGF1Padding |
test_214_bytes.txt 214 bytes test_215_bytes.txt 215 bytes openssl -oaepの場合は PKCS#1v2.0 Padding方式 SHA-1を使用している。 rem 「公開鍵」を使って平文を暗号化 openssl rsautl -encrypt -oaep -pubin -inkey public-key.pem -in test_214_bytes.txt -out test_214_bytes.enc 214 bytesなのでエラーが出ないで暗号化処理ができる rem 「公開鍵」を使って平文を暗号化 214バイトを超えているので暗号化できない openssl rsautl -encrypt -oaep -pubin -inkey public-key.pem -in test_215_bytes.txt -out test_215_bytes.enc RSA operation error 7872:error:0409A06E:rsa routines:RSA_padding_add_PKCS1_OAEP_mgf1:data too large for key size:crypto\rsa\rsa_oaep.c:62: 215 bytesなのでエラーが出て暗号化処理ができない
rem 「秘密鍵」を使って平文を暗号化 openssl rsautl -encrypt ^ -inkey private-key.pem ^ -in test_245_bytes.txt -out test_245_bytes.enc rem 「公開鍵」を使って暗号文を復号化 openssl rsautl -decrypt ^ -pubin -inkey public-key.pem ^ -in test_245_bytes.enc -out decode_test_245_bytes.txt A private key is needed for this operation
rem 「秘密鍵」を使って平文を暗号化 -sign openssl rsautl -sign ^ -inkey private-key.pem ^ -in test_245_bytes.txt -out test_245_bytes.enc rem 「公開鍵」を使って暗号文を復号化 -verify openssl rsautl -verify ^ -inkey public-key.pem -pubin ^ -in test_245_bytes.enc -out decode_test_245_bytes.txt type decode_test_245_bytes.txt 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789:123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789:123456789/123456789/123456789/123456789/12345 rem 「秘密鍵」を使って平文を暗号化 -sign 246 bytesなのでエラーが出て暗号化処理ができない openssl rsautl -sign ^ -inkey private-key.pem ^ -in test_246_bytes.txt -out test_245_bytes.enc RSA operation error 6684:error:0406C06E:rsa routines:RSA_padding_add_PKCS1_type_1:data too large for key size:crypto\rsa\rsa_pk1.c:26:
単純に「ブロック単位に区切る」方法 ブロック単位に区切って暗号・復号の処理を行なう。 "Bad Dada" When Call RSACryptoServiceProvider.Decrypt Method on Some Machine 暗号処理にサイズ制限の無い共通鍵を使って全体を暗号化する方法(SMIME S/MIME方式) 送信側 1) 本文を「共通鍵」で暗号化する 2) 「共通鍵」を RSAの「公開鍵」で RSA方式で暗号化する 受信側 3) 暗号化した「共通鍵」を RSAの「秘密鍵」で RSA方式で復号化する 4) 本文を「共通鍵」で復号化する ※ 受信側から送信側に対してRSAの「公開鍵」を送信する必要がある
● PEM形式の「公開鍵」 PUBLIC -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo0+GLgT29D/RlYFj0mKB wVzBloOSWXJy5hbPDpRVGlFVJf41LJ0vTFSUB2M7xbWikBCkIyE/vXU5oKahyCPq .. 省略 .. eqrns6QW5PYR6koIxnaYQhiKr5e+jNhl6L6MBjIQPKfyjN2pX+8qslP8ivigvYuT adgPycin7mVy1O8RfVuBGWJclPRIR1vaY3SNoYaqNZd9Lf+xUVRl+OkkuycmpzAF 7wIDAQAB -----END PUBLIC KEY-----
● PEM形式の「秘密鍵」 PRIVATE -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA1UoUayRIbXJG+XmKZT+H0+qCX5MGVl4l3QSVQpONib3PB53r XOVHtHCFKM5JJs/IRdUbFc5hejF7Aovvzj8w+G6R902RZ0SJxcrHMKO9gnlldrSX .. 省略 .. Ua7URdl2NSvXIhw0roBb1cSv7NQH883k3KbrCi04h57FzzryQkNK43mu/WmGVeMX MqNZF89IMde2SMlg3RWC2Kr+b3BoWyHCjOhlJncup+MpNWLONcSF4Q== -----END RSA PRIVATE KEY-----
static OPT_PAIR formats[] = { {"PEM/DER", OPT_FMT_PEMDER}, {"pkcs12", OPT_FMT_PKCS12}, {"smime", OPT_FMT_SMIME}, {"engine", OPT_FMT_ENGINE}, {"msblob", OPT_FMT_MSBLOB}, {"netscape", OPT_FMT_NETSCAPE}, {"nss", OPT_FMT_NSS}, {"text", OPT_FMT_TEXT}, {"http", OPT_FMT_HTTP}, {"pvk", OPT_FMT_PVK}, };