簡體   English   中英

在沒有BouncyCastle的Java中使用RSA加密

[英]Using RSA encryption in Java without BouncyCastle

在我的程序中,我正在嘗試使用以下代碼使用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無濟於事。我知道安裝BouncyCastle可能有所幫助,但我想避免它(我想避免更多的依賴,我已經無論如何都要安裝它的一些問題)。 提前感謝任何想法。

正如評論中所說, SecretKeySpec僅用於對稱算法。 你提到你通過調用getEncoded得到包含密鑰的byte[]

有兩種可能性和兩種結果格式:

RSA PrivateKey的編碼

在RSA私鑰的實例上調用PrivateKey#getEncoded將導致私鑰的PKCS#8編碼,並且可以在PKCS8EncodedKeySpec的幫助下恢復。

RSA PublicKey的編碼

RSA PublicKey#getEncoded上的PublicKey#getEncoded導致通用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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM