NO3.Opensslは証明書を生成し、証明書の公開鍵暗号化秘密鍵復号をテストする

4121 ワード

一、公開鍵を取る、例中server.crtをDディスクルートの下に置く
// 
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// 
FileInputStream fis = new FileInputStream("D:/server.crt");
// 
Certificate cert = cf.generateCertificate(fis);
// 
fis.close();
// 
PublicKey publicKey = cert.getPublicKey();

二、秘密鍵の取得
     1.serverを直接読み出す.keyファイルが間違っています.
      
 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence

 
       
serverをkeyファイルをPKCS 8形式に変換する:
コマンド:
openssl pkcs8 -topk8 -nocrypt -in server.key -out myrsakey_pcks8

 
PKCS 8形式の鍵を生成するmyrsakey_pcks8
        myrsakey_pcks 8の内容:
       
-----BEGIN PRIVATE KEY-----
MIICXQIBAAKBgQDB49bqrPV4BEmoWmBsLy/JNVbWC1Rz/tkKAjvszeE+8cQwxmYQ
oJMKXcmYSV9NF/Ftxj+Fydu9iHM8FzEQjDoB9pxPIfV8n4+F1R0y5rrTzBwYXuAm
JSo0OnLGXVhJSjwOGu0vRu4SoSH+g0QKHuPDoOAfiKdnNQuJF0TGug5yGwIDAQAB
AoGAVqOd9K2m3qNj2qPP9Ge9fbak/+5+JXsatvs6ld2Fql/UYEs3bnSiX/56x975
g/SQAJKW7gy+cVoYzCA8330ZqeBq4GFhisXeCL7YDakFraFHALcYo19BWSc02N96
cuq9qU9E0ZMNDBPlLrUrJ34i33B4eX+h1CLhO7rJzoyMPZkCQQD62T5uZqTR/5Aw
Uw3F/IGctwVUMRu9VeLVYnDSIKZasalDXujGtFjyhk9df+mjSq6reH/gg5PLBSPv
WErT5B6lAkEAxd8nbXERRqLhQlnzL6CnoqpwjPL6E7pnb7qIrgYchaONUQvlCEaH
31uy1VyDxueB1UwfY6VjZGIkd6SmkqYxvwJBAO2PKVnCaVra7UFmlkemz1SL20cV
TtDq8mvk0zWcaA7B66t6yXXMu+PKIIVKqwfSpUKMVoZX9XIyBwsXEZ5DjmUCQQDB
9v1cT/DicDomY6x6rJ6HW1JXKLux6REKOi1PgdglvGyD3QgXc6QvdGE6u6TFrxzb
bPJ8KJzkwzwCOFm8+cNbAkBue461A4i616SH7Q/VQ3In0qGTZ5QwHksHV86vbfmM
S/v6T/SOYqP/zDmMuZhsa+FyBrV8feYOb4vgbXoDaJtM
-----END PRIVATE KEY-----
 
 
     2.仮にmyrsakey_pcks 8はDディスクルートディレクトリの下にあり、
 
// KEY 
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
// PKCS8 
BufferedReader br = new BufferedReader(new FileReader("D:/rsakey_pcks8"));
//rsakey_pcks8 -----BEGIN PRIVATE KEY-----
String s = br.readLine();
StringBuffer sb = new StringBuffer();
// rsakey_pcks8 
s = br.readLine();
// 
while (s.charAt(0) != '-') {
	sb.append(s + "\r");
	s = br.readLine();
	}
// base64 , org.apache.commons.codec.binary.Base64
byte[] keybyte = Base64.decodeBase64(sb.toString());
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keybyte);
// 
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
三、公開鍵による暗号化
// 
 public static byte[] cryptByPublicKey(PublicKey publicKey, int cipherMode,
                                          byte[] bytes) throws NoSuchAlgorithmException,
            NoSuchPaddingException, InvalidKeyException,
            IllegalBlockSizeException, BadPaddingException {

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(cipherMode, publicKey);
        return cipher.doFinal(bytes);
    }
公開鍵を使用して「12345」を暗号化
byte[] b =cryptByPublicKey(publicKey, Cipher.ENCRYPT_MODE, "12345".getBytes());
四、秘密鍵で復号する
// 
  public static byte[] cryptByPrivateKey(PrivateKey privateKey,
                                           int cipherMode, byte[] plainTextBytes)
            throws NoSuchAlgorithmException, NoSuchPaddingException,
            InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(cipherMode, privateKey);
        return cipher.doFinal(plainTextBytes);
    }
秘密鍵を使用して復号
byte[] t = RSAUtil.cryptByPrivateKey(privateKey, Cipher.DECRYPT_MODE, b);
String out = new String(t, "utf-8");
System.out.println(out);
が終了しました.