3

私のプログラムでは、次のコードを使用して RSA でプレーンテキストを暗号化しようとしています。

static String RSAEncrypt(String pubkey, String plain){
    return encrypt(pubkey,plain,"RSA");
}
static String encrypt(String stringKey, String plain, String algo){
    String enc="failed";
    try{
    byte[] byteKey  = new BASE64Decoder().decodeBuffer(stringKey);
    Key key = new SecretKeySpec(byteKey,algo);

    byte[] data = plain.getBytes();
    Cipher c = Cipher.getInstance(algo);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal = c.doFinal(data);
    enc = new BASE64Encoder().encode(encVal);
    }catch(Exception e){e.printStackTrace();}

    return enc;
}

ただし、実行すると、次のエラーが表示されます。

java.security.InvalidKeyException: No installed provider supports this key: javax.crypto.spec.SecretKeySpec
at javax.crypto.Cipher.chooseProvider(Cipher.java:877)
at javax.crypto.Cipher.init(Cipher.java:1212)
at javax.crypto.Cipher.init(Cipher.java:1152)
at Crypto.encrypt(Crypto.java:37)
at Crypto.RSAEncrypt(Crypto.java:62)

RSA/None/PKCS1Padding および RSA/ECB/PKCS1Padding に変更してみましたが、役に立ちませんでした。とにかくインストールに問題がありました)。アイデアをお寄せいただきありがとうございます。

4

1 に答える 1

7

コメントで述べたように、SecretKeySpec対称アルゴリズム専用です。byte[]を呼び出して、キーを含むものを取得したと述べましたgetEncoded

2 つの可能性と 2 つの結果の形式があります。

RSA 秘密鍵のエンコード

RSA 秘密鍵のインスタンスを呼び出すPrivateKey#getEncodedと、秘密鍵が PKCS#8 でエンコードされ、PKCS8EncodedKeySpecを使用して復元できます。

RSA PublicKey のエンコーディング

PublicKey#getEncodedRSA 公開鍵では、一般的な X.509 公開鍵エンコーディングになり、X509EncodedKeySpecで復元できます。

使用例

byte[] data = "test".getBytes("UTF8");
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(512);
KeyPair keyPair = kpg.genKeyPair();
        
byte[] pk = keyPair.getPublic().getEncoded();
X509EncodedKeySpec spec = new X509EncodedKeySpec(pk);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(spec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encrypted = cipher.doFinal(data);
        
byte[] priv = keyPair.getPrivate().getEncoded();
PKCS8EncodedKeySpec spec2 = new PKCS8EncodedKeySpec(priv);
PrivateKey privKey = keyFactory.generatePrivate(spec2);
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] plain = cipher.doFinal(encrypted);
        
System.out.println(new String(plain, "UTF8")); //=> "test"
于 2012-06-09T03:28:22.863 に答える