Java8 で書きなおした → JavaSE RSA暗号 Java8

RSA暗号概略

RSA暗号の基本的な考え方

  1. 平文 x を n乗 したものを 二つの素数の組(p,q)の積(p×q)で割った余りを一覧表にして暗号表を作る
    ここでは (p,q)=(3,5) を例に考える。
    matrix.png
     
  2. この表を見ると定期的に元の平文が現れていることが分かる(ピンクの列)
    • n × LCM( p-1 , q-1 ) + 1 行が平文と同じになっている
    • LCM (Least Common Multiple。最小公倍数)。LCM(3-1,5-1)=4
  3. 暗号への応用
    • 平文をE乗して暗号化し、暗号文をD乗したらピンクの列に乗るような(E,D)の組を見つける
    • 鍵セット = (E,D)
    • この鍵セットは逆に使うこともできる
      • 平文をD乗して暗号化し、暗号文をE乗してもピンクの列に乗る

公開鍵と秘密鍵

  1. 鍵セットの求め方
    rsaGetKey.png
     
  2. 鍵セットの利用例
    • (p,q)=(3,5) のとき、(E,D)=(3,7)は有効な鍵セット。E=3 を秘密鍵、D=7 を公開鍵と呼ぶとすると
    1. 秘密鍵(3) で暗号化して、公開鍵(7) で復号化
    2. 公開鍵(7) で暗号化して、秘密鍵(3) で復号化
      decrypt.png
       
    3. 確かに、3 を秘密鍵(3)で暗号化すると 12 になり、12 を公開鍵(7)で復号化すると 3 に戻っている
      [source] [reload]

RSA暗号で暗号化できる平文の長さ

  1. RSA暗号は、平文を n乗 して m で割った余りを用いて暗号化するので、mより大きい値を暗号化することはできない
    • RSA暗号では、暗号化したい文字列を一つの値として扱う。
      ABCD = 0x41424344 = 1094861636
    • 鍵長が 64bit の場合には、おおむね
      0xFFFFFFFF = 4294967295
      までの値を暗号化することができる。(正確には 0xFFFFFFFF 以下で一番大きい素数の積まで)
  2. RSA-???? の鍵長
    通常 11byte を Padding に使うので、????で示された bit 長さから、88bit(11byte)を引いたものが鍵長
    鍵長(Padding含む)平文の最大長(=実質的な鍵長)
    RSA-512512bit(64byte)53byte
    RSA-10241024bit(128byte)117byte
    RSA-20482048bit(256byte)245byte
  3. 長文を暗号化するには
    • 長文を n byte 毎に区切って暗号化すれば暗号化できないこともないが、普通はそういうことはしない。
    • 通常は、コンテンツ本体は共通鍵で暗号化し、共通鍵をRSAで暗号化して送る。
      ================(送信側)===========|     |===========(受信側)==================
      [長文]--(暗号化)------------>[****]………>[****]-------------(復号化)-->[長文]
                 ↑                    |     |                      ↑
              [共通鍵]--(暗号化)-->[????]………>[????]--(復号化)-->[共通鍵]
            (通常は乱数)   ↑          |     |           ↑
                        [公開鍵]         |     |        [秘密鍵]
      ===================================|     |======================================
      • 〜信側:乱数を共通鍵として、長文を暗号化
      • ∩信側:共通鍵を公開鍵で暗号化
      • 受信側:送られてきた共通鍵[????]を復号化
      • ぜ信側:復号化した共通鍵で、送られてきた長文[****]を復号化

秘密鍵の保存方法

  1. PKCS(Public Key Cryptography Standard)
  2. DER/PEM
    • 鍵の保存方法
      DERDistinguished Encoding Rulesバイナリ形式
      PEMPrivacy Enhanced MailDERをBase64でテキスト化したもの
    • PKCS#8 を DER で保存
    • PKCS#12 を PEM で保存

公開鍵の保存方法

  1. X.509の登場人物
    利用者公開鍵の利用者
    サービス提供者公開鍵の提供者
    CA(Certification Authority)信頼の置ける機関
    • 利用者は、サービス提供者の提供する公開鍵を使いたいが、サービス提供者を信頼して良いか分からない
    • 利用者は、CAを信頼している
  2. X.509 は、公開鍵 + CAのお墨付き
  3. X.509の構造
    パラメータ
    CA 署名書バージョンV1
    CA 証明書シリアル番号整数
    CA 署名アルゴリズムSHA1 RSA
    CA 名Foo Co.LTD
    有効期限2031/12/31
    サービス提供者Bar Co.LTD
    公開鍵アルゴリズムRSA
    公開鍵
    署名アルゴリズムと同じ(SHA1など)
    署名encrypt(CA秘密鍵, digest(,´↓きキΝЛ))
  4. 証明書の確認方法
    • は、 銑┐鬮でダイジェスト化したものを CA の秘密鍵で暗号化したものが記述されている
    • 利用者側では、を CA の公開鍵で復号化したものと、 銑┐鬮でダイジェスト化したものが一致すれば、この証明書は、確かに CA がお墨付きを与えたものだと分かる
      decrypt(CA公開鍵,) =? digest(,´↓きキΝЛ)

Java SE での RSA暗号

Java SE 5.0 (=Java2 1.5) から、RSA暗号の実装*1が標準で組み込まれるようになりました。
ほかの暗号と同様に、JCAの手順で暗号化・復号化しているので、main() から順に見ていけば分かると思います。
Java 1.4以前で RSA暗号 を扱うためには、RSA暗号の実装を別途準備する必要があります( http://www.bouncycastle.org/ を利用することができます)。

package com.snail.example;

import sun.misc.HexDumpEncoder;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAKey;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;


/**
 * RSA Examination.
 *
 * @author kagyuu
 * @version $Revision$
 */
public class RSAExam {
  /** sources of the example document */
  private static String[] WISDOMS = new String[] {
      "Insanity: doing the same thing over and over again and expecting different results.",
      "Albert Einstein",
      "Happiness is nothing more than good health and a bad memory.",
      "Albert Schweitzer",
      "Our problems are man-made, therefore they may be solved by man.", "J.F.K",
      "Obstacles are those frightful things you see when you take your eyes off your goal. ",
      "Henry Ford"
    };

  /** Example plain document */
  private static String EXAMPLE = WISDOMS[0] + WISDOMS[1];

  /** KEY LENGTH */
  private static int KEY_LENGTH = 1024;

  /**
   * Main Routine.
   *
   * @param args Commandline Argument
   */
  public static void main(String[] args) {
    // Create Key Pair
    KeyPair keyPair = createKeyPair();

    System.out.println("Private Key: "
      + ((RSAKey) keyPair.getPrivate()).getModulus().bitLength() + "bit.");
    System.out.println("Public  Key: "
      + ((RSAKey) keyPair.getPublic()).getModulus().bitLength() + "bit.");

    // Raw data
    System.out.println("\nRAW DATA");

    byte[] rawText = EXAMPLE.getBytes();
    hexDump(rawText);

    try {
      // Encrypt data
      byte[] encryptedText = encrypt(keyPair.getPublic(), rawText);
      System.out.println("\nENCRYPTED DATA");
      hexDump(encryptedText);

      // Decrypt data
      byte[] decryptedText = decrypt(keyPair.getPrivate(), encryptedText);
      System.out.println("\nDECRYPTED DATA");
      hexDump(decryptedText);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * Create Key Pair.
   *
   * @return key pair
   */
  private static KeyPair createKeyPair() {
    KeyPair keyPair = null;

    try {
      KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
      keygen.initialize(KEY_LENGTH);

      keyPair = keygen.generateKeyPair();

      System.out.print("PUBLIC KEY (");
      System.out.print(keyPair.getPublic().getAlgorithm() + " ");
      System.out.println(keyPair.getPublic().getFormat() + ")");
      hexDump(keyPair.getPublic().getEncoded());

      System.out.print("\nPRIVATE KEY (");
      System.out.print(keyPair.getPrivate().getAlgorithm() + " ");
      System.out.println(keyPair.getPrivate().getFormat() + ")");
      hexDump(keyPair.getPrivate().getEncoded());
    } catch (NoSuchAlgorithmException e) {
      // should not happen
      e.printStackTrace();
      System.exit(-1);
    }

    return keyPair;
  }

  /**
   * Decrypt data.
   *
   * @param key decrypt key
   * @param data encrypted data
   *
   * @return decrypted data
   *
   * @throws InvalidKeyException key is wrong
   * @throws IllegalBlockSizeException data is wrong ( too long )
   */
  private static byte[] decrypt(Key key, byte[] data)
    throws InvalidKeyException, IllegalBlockSizeException {
    byte[] decrypted = null;

    try {
      Cipher cipher = Cipher.getInstance("RSA");
      cipher.init(Cipher.DECRYPT_MODE, key);

      decrypted = cipher.doFinal(data);
    } catch (NoSuchAlgorithmException e) {
      // should not happen
      e.printStackTrace();
      System.exit(-1);
    } catch (NoSuchPaddingException e) {
      // should not happen
      e.printStackTrace();
      System.exit(-1);
    } catch (BadPaddingException e) {
      // should not happen
      e.printStackTrace();
      System.exit(-1);
    }

    return decrypted;
  }

  /**
   * Encrypt data.
   *
   * @param key encrypt key
   * @param data data
   *
   * @return encrypted data
   *
   * @throws InvalidKeyException key is wrong
   * @throws IllegalBlockSizeException data is wrong ( too long )
   */
  private static byte[] encrypt(Key key, byte[] data)
    throws InvalidKeyException, IllegalBlockSizeException {
    byte[] encrypted = null;

    try {
      Cipher cipher = Cipher.getInstance("RSA");
      cipher.init(Cipher.ENCRYPT_MODE, key);

      encrypted = cipher.doFinal(data);
    } catch (NoSuchAlgorithmException e) {
      // should not happen
      e.printStackTrace();
      System.exit(-1);
    } catch (NoSuchPaddingException e) {
      // should not happen
      e.printStackTrace();
      System.exit(-1);
    } catch (BadPaddingException e) {
      // should not happen
      e.printStackTrace();
      System.exit(-1);
    }

    return encrypted;
  }

  /**
   * Dump Byte Array.
   *
   * @param dump byte array.
   */
  private static void hexDump(byte[] dump) {
    HexDumpEncoder hexDump = new HexDumpEncoder();
    System.out.println(hexDump.encode(dump));
  }
}

実行結果

PUBLIC KEY (RSA X.509)
0000: 30 81 9F 30 0D 06 09 2A   86 48 86 F7 0D 01 01 01  0..0...*.H......
0010: 05 00 03 81 8D 00 30 81   89 02 81 81 00 B3 A7 70  ......0........p
0020: 33 E6 77 02 13 5B AE E5   C6 97 A0 95 8B 4F B9 11  3.w..[.......O..
0030: FE 54 22 97 9F 94 AD ED   CB 7D 85 C5 40 88 46 FF  .T".........@.F.
0040: 59 B8 AF 69 5F AC 06 67   F9 F0 6D 4D EE 2A 25 71  Y..i_..g..mM.*%q
0050: 90 96 B2 50 1E 23 71 22   56 C9 7B 0D 04 29 44 AD  ...P.#q"V....)D.
0060: 62 DF ED 08 D6 64 24 C6   E0 B0 ED D8 AA 8C DA A0  b....d$.........
0070: C0 23 83 20 4E A4 8F 33   AB EF 0E 9B 2F CA AA B2  .#. N..3..../...
0080: 7C 96 13 10 F2 16 5B D7   D2 48 42 8D 0F 7A 5B AC  ......[..HB..z[.
0090: B9 71 49 55 81 03 B4 9B   82 68 95 83 A3 02 03 01  .qIU.....h......
00A0: 00 01 

PRIVATE KEY (RSA PKCS#8)
0000: 30 82 02 77 02 01 00 30   0D 06 09 2A 86 48 86 F7  0..w...0...*.H..
0010: 0D 01 01 01 05 00 04 82   02 61 30 82 02 5D 02 01  .........a0..]..
0020: 00 02 81 81 00 B3 A7 70   33 E6 77 02 13 5B AE E5  .......p3.w..[..
0030: C6 97 A0 95 8B 4F B9 11   FE 54 22 97 9F 94 AD ED  .....O...T".....
0040: CB 7D 85 C5 40 88 46 FF   59 B8 AF 69 5F AC 06 67  ....@.F.Y..i_..g
0050: F9 F0 6D 4D EE 2A 25 71   90 96 B2 50 1E 23 71 22  ..mM.*%q...P.#q"
0060: 56 C9 7B 0D 04 29 44 AD   62 DF ED 08 D6 64 24 C6  V....)D.b....d$.
0070: E0 B0 ED D8 AA 8C DA A0   C0 23 83 20 4E A4 8F 33  .........#. N..3
0080: AB EF 0E 9B 2F CA AA B2   7C 96 13 10 F2 16 5B D7  ..../.........[.
0090: D2 48 42 8D 0F 7A 5B AC   B9 71 49 55 81 03 B4 9B  .HB..z[..qIU....
00A0: 82 68 95 83 A3 02 03 01   00 01 02 81 80 53 23 C4  .h...........S#.
00B0: B8 30 0A 99 2A 4E 3E A5   55 7F 6C 30 68 B5 2F 47  .0..*N>.U.l0h./G
00C0: 95 74 68 41 D4 F7 20 7A   B0 B6 59 46 CC B3 84 6F  .thA.. z..YF...o
00D0: BD 9C CB 88 AF 5E D3 E4   20 75 D4 8F C1 0D 3E 20  .....^.. u....> 
00E0: CD 32 00 39 35 89 5F 5C   ED DE F6 14 32 37 2D B6  .2.95._\....27-.
00F0: 5D EE 44 7A 3E E4 B3 8E   55 0A BB 1E 3B 69 E1 E7  ].Dz>...U...;i..
0100: FF 37 CA 0F 54 0A 3B A8   A0 48 8B 40 0E 78 DC 61  .7..T.;..H.@.x.a
0110: 92 62 88 AC 68 C9 7B 8D   8F 0E F7 24 FA B2 C6 C3  .b..h......$....
0120: 37 37 72 EC 6A EF 5A AD   B1 F3 B5 0D 51 02 41 00  77r.j.Z.....Q.A.
0130: DE 0F 9F 50 A8 BA 84 00   72 89 33 CF 93 29 97 A5  ...P....r.3..)..
0140: 4D 23 4C 54 68 EF DA 77   50 E9 F1 DB C7 0F 51 DB  M#LTh..wP.....Q.
0150: BE 2A 95 BE 81 09 25 DF   C1 CD 26 D2 F1 4F 38 05  .*....%...&..O8.
0160: 0E 1B C6 1C D5 2A F1 CE   25 92 40 4E 31 DB CD 0B  .....*..%.@N1...
0170: 02 41 00 CF 1C 98 F3 39   65 9D 6D D1 A5 AD 83 E2  .A.....9e.m.....
0180: 84 FF CB 51 A6 6A 5D A2   70 D7 89 4D D2 EE 66 E6  ...Q.j].p..M..f.
0190: 00 B7 5F 78 4A 4E A3 4A   50 FD 6F 50 8F E1 95 F3  .._xJN.JP.oP....
01A0: C7 3A CA 8F E4 1D B2 45   8C 8D 0F 45 4C EE 5A DE  .:.....E...EL.Z.
01B0: 7C 52 C9 02 40 42 E1 DB   AF 34 92 B0 CD 5D B1 FB  .R..@B...4...]..
01C0: 5B EA CC 1D 33 99 6F 27   3F 49 37 EC CA 01 21 E5  [...3.o'?I7...!.
01D0: 49 B7 C3 E2 78 D7 E7 05   A1 12 46 4A 15 01 CF 23  I...x.....FJ...#
01E0: 81 67 52 DF E1 8D E5 49   9F 47 89 1E B9 63 51 90  .gR....I.G...cQ.
01F0: 72 BC CB A2 0F 02 41 00   C4 4F 5F EE 52 FE 2D 1D  r.....A..O_.R.-.
0200: 55 B5 0B 65 D1 C4 AC CC   64 05 30 16 B6 8C EC CF  U..e....d.0.....
0210: 79 53 B0 A3 19 E9 9D E6   41 17 75 B8 33 0D D7 5A  yS......A.u.3..Z
0220: B6 6A DA B1 0E 93 4D F7   88 31 F9 AF EB 5A 50 AE  .j....M..1...ZP.
0230: 23 CA CA B6 98 E2 10 79   02 41 00 A1 15 83 7A 5B  #......y.A....z[
0240: D9 A7 66 49 E0 72 C3 CC   82 8C EC CD D4 E9 0C 91  ..fI.r..........
0250: DE F1 AC 50 39 DB FC FC   65 F8 96 86 20 43 22 9F  ...P9...e... C".
0260: 6C 1B 49 08 61 25 5E D8   EE F6 C9 45 8D D8 7C 84  l.I.a%^....E....
0270: 01 5C 8A D5 F1 1B 64 42   75 C8 7C 
Private Key: 1024bit.
Public  Key: 1024bit.

RAW DATA
0000: 49 6E 73 61 6E 69 74 79   3A 20 64 6F 69 6E 67 20  Insanity: doing 
0010: 74 68 65 20 73 61 6D 65   20 74 68 69 6E 67 20 6F  the same thing o
0020: 76 65 72 20 61 6E 64 20   6F 76 65 72 20 61 67 61  ver and over aga
0030: 69 6E 20 61 6E 64 20 65   78 70 65 63 74 69 6E 67  in and expecting
0040: 20 64 69 66 66 65 72 65   6E 74 20 72 65 73 75 6C   different resul
0050: 74 73 2E 41 6C 62 65 72   74 20 45 69 6E 73 74 65  ts.Albert Einste
0060: 69 6E 

ENCRYPTED DATA
0000: 26 30 89 62 52 AC 90 6F   1B 7C 87 06 B2 72 AE 85  &0.bR..o.....r..
0010: DC 40 D0 40 5F B5 47 54   59 D2 6E 40 C0 B3 5D B9  .@.@_.GTY.n@..].
0020: FE E1 F2 20 53 A9 36 C6   5F 7A FA 31 78 5D 29 79  ... S.6._z.1x])y
0030: 93 5F 1D BB 23 10 FA F0   53 B2 38 A4 C2 6D 6A D0  ._..#...S.8..mj.
0040: C6 C8 D6 F0 08 24 EB 52   2B 43 23 18 C3 17 F8 A8  .....$.R+C#.....
0050: 3B 2E F7 D1 90 A4 11 0B   A5 43 49 BA 6E 9C 94 AA  ;........CI.n...
0060: B0 3C EC B4 95 BB 67 9C   48 DB D1 83 CC 83 56 41  .<....g.H.....VA
0070: AF B5 65 31 2A 07 79 AB   1F 7E 03 3B C7 A9 95 2A  ..e1*.y....;...*

DECRYPTED DATA
0000: 49 6E 73 61 6E 69 74 79   3A 20 64 6F 69 6E 67 20  Insanity: doing 
0010: 74 68 65 20 73 61 6D 65   20 74 68 69 6E 67 20 6F  the same thing o
0020: 76 65 72 20 61 6E 64 20   6F 76 65 72 20 61 67 61  ver and over aga
0030: 69 6E 20 61 6E 64 20 65   78 70 65 63 74 69 6E 67  in and expecting
0040: 20 64 69 66 66 65 72 65   6E 74 20 72 65 73 75 6C   different resul
0050: 74 73 2E 41 6C 62 65 72   74 20 45 69 6E 73 74 65  ts.Albert Einste
0060: 69 6E 

平文が鍵長よりも長いとき

鍵長が 1024bit のときには、117byte までの平文しか暗号化できません。(cf.RSA-???? の鍵長)

…
Private Key: 1024bit.
Public  Key: 1024bit.

RAW DATA
0000: 49 6E 73 61 6E 69 74 79   3A 20 64 6F 69 6E 67 20  Insanity: doing 
0010: 74 68 65 20 73 61 6D 65   20 74 68 69 6E 67 20 6F  the same thing o
0020: 76 65 72 20 61 6E 64 20   6F 76 65 72 20 61 67 61  ver and over aga
0030: 69 6E 20 61 6E 64 20 65   78 70 65 63 74 69 6E 67  in and expecting
0040: 20 64 69 66 66 65 72 65   6E 74 20 72 65 73 75 6C   different resul
0050: 74 73 2E 41 6C 62 65 72   74 20 45 69 6E 73 74 65  ts.Albert Einste
0060: 69 6E 48 61 70 70 69 6E   65 73 73 20 69 73 20 6E  inHappiness is n
0070: 6F 74 68 69 6E 67 20 6D   6F 72 65 20 74 68 61 6E  othing more than
0080: 20 67 6F 6F 64 20 68 65   61 6C 74 68 20 61 6E 64   good health and
0090: 20 61 20 62 61 64 20 6D   65 6D 6F 72 79 2E 41 6C   a bad memory.Al
00A0: 62 65 72 74 20 53 63 68   77 65 69 74 7A 65 72

javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
	at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
	at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
	at javax.crypto.Cipher.doFinal(DashoA13*..)
	at com.snail.example.RSAExam.encrypt(RSAExam.java:165)
	at com.snail.example.RSAExam.main(RSAExam.java:64)

Open SSL で作った鍵ペアを使う

秘密鍵(PKCS#8)と公開鍵(X.509)を作る

  1. 申請書の作成
    kagyuu@grape:~> /usr/share/ssl/misc/CA.pl -newreq-nodes
    Generating a 1024 bit RSA private key
    ..++++++
    ....++++++
    writing new private key to 'newreq.pem'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:Musashi
    Locality Name (eg, city) []:Edo
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:ISEYA LTD
    Organizational Unit Name (eg, section) []:Web Admin
    Common Name (eg, YOUR name) []:Saemon
    Email Address []:saemon@ise.co.jp
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Request (and private key) is in newreq.pem
  2. 申請書から秘密鍵を取り出す
    kagyuu@grape:~> openssl rsa -in newreq.pem -out key.prv
    writing RSA key
    kagyuu@grape:~> openssl pkcs8 -topk8 -in key.prv -out key.pkcs8 -nocrypt
    kagyuu@grape:~> cat key.pkcs8
    -----BEGIN PRIVATE KEY-----
    MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANlpV2MggGPPSBMU
    Ht0myHcLCS1PfJ+Iqrn8+6a/uq1//X8Z/a+/64RoOPAowL2z3XTp1ylj9KGh9uIv
    QIZzcRtHF8tVubY3np9mN5htWzHlDStF7YTb0ypJlpKD9Oon9LhlXxN1hMe9HTuA
    AlH67SAUJYk6n03cRzE7ZO2VqjQrAgMBAAECgYABOxJukjmH1x2OVhfSoqyR1/Mm
    WYPYF1r4EJGQIRe6cbYKqSgBfbGknz5rRZ/JsyH2zngUWOeCnrsaDrBr0m16emCZ
    8M+MEd6XxdtXH0WMKstMA9ZQLWkLKkugljOT73Ud1CVTO7eo2HOixU3m5qei0gte
    NtgOrt3M+Zw2KbYxuQJBAPoKg76m0hAW3FzUD5+MBZS54BJpFADpvlY9Gb9c8oY7
    dfruo5isqlo+JCQoft1v9iX0RZV4z8c9yX6Gb/jA7T0CQQDel8FwySQKF4jDnjOC
    Il0R5xdbT/0fEm0YwQ6fN/WJiXM6B/s4AHAc2Lo/GHm3rzUw/ra7u91bxpT++6Db
    dQ2HAkEAsN81OGzbFWSGdufPMWYkIIOnnH5WFxtBd9F64CIIsKlpGJssgHhLfNCO
    UkGPFGb5sPltK4GtQNxVJzpEBKu8ZQJAClGCmBXa49TfdCH7RUcOhWvu+z6j/zK9
    d+5LHTpc2XlTrBb+oEP07oFlcNNToR4wGwtTsTQuOLjl40QK2uF8NQJAN++aX5bf
    xhPw7fu7KbSc6pvoj8NS7hE7WD911tkBnR2ooGH8of3N3rq0qEzB6t7d1HOfNXmN
    gR95xd2jgU9NJw==
    -----END PRIVATE KEY-----
    kagyuu@grape:~>
    "-nocrypt"にしないと、Java(PKCS8EncodedKeySpec?)から読めないようだ
  3. 申請書から公開鍵を取り出す
    kagyuu@grape:~> openssl rsa -in newreq.pem -pubout -out key.pub.x509
    writing RSA key
    kagyuu@grape:~> cat key.pub.x509
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZaVdjIIBjz0gTFB7dJsh3Cwkt
    T3yfiKq5/Pumv7qtf/1/Gf2vv+uEaDjwKMC9s9106dcpY/ShofbiL0CGc3EbRxfL
    Vbm2N56fZjeYbVsx5Q0rRe2E29MqSZaSg/TqJ/S4ZV8TdYTHvR07gAJR+u0gFCWJ
    Op9N3EcxO2Ttlao0KwIDAQAB
    -----END PUBLIC KEY-----

Java SEで、鍵セットを読み取る

実行結果

参考文献

  1. サルにもわかるRSA暗号, http://www.maitou.gr.jp/rsa/
  2. PHPマニュアル, http://jp2.php.net/manual/ja/function.openssl-public-encrypt.php#55901

Java#JavaSE


*1 Java2 1.4までは、RSA暗号クラスのインタフェースのみ提供

添付ファイル: filedecrypt.png 587件 [詳細] filersaGetKey.png 1398件 [詳細] filersaEnDeCrypt.png 1379件 [詳細] filematrix.png 1532件 [詳細] filersa.html 18354件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2014-06-16 (月) 21:55:44 (901d)
ISBN10
ISBN13
9784061426061