2016-05-23 65 views
0

我想用java中的給定公鑰(公鑰是一個字符串)以rsa/ecb/pkcs1填充模式對字符串進行編碼。如何使用java中給定的公鑰對rsa/ecb/pkcs1填充模式下的文本進行編碼?

我也想以UTF-8格式顯示結果 怎麼辦?

+0

有很多在那裏的例子。你有什麼問題?如果你想把它放在一個字符串中,不要忘記用base64或者hex來編碼密文。 –

+0

結果將基本上是隨機字節,並非所有這些字節都是有效的UTF-8編碼。如果你需要UTF-8你需要在隨機輸出上使用編碼,通常使用Base64和Hexadecimal。 – zaph

回答

0

假設你正在使用一個有效的RSA密鑰,你需要:

  1. 從字符串轉換你的公鑰實際公鑰對象

    //This code is incorrect. You'll need bouncy castle for PKCS1 
    KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
    byte[] keyBytes = Base64().getDecoder.decode(publicKey.getBytes()); //assuming base64 encoded key 
    PKCS1EncodedKeySpec KeySpec = new PKCS1EncodedKeySpec(keyBytes); 
    RSAPublicKey publicKey = (RSAPublicKey)keyFactory.generatePublic(KeySpec); 
    
  2. 獲取字節的明文

  3. 使用您的公鑰加密
  4. 編碼爲可讀格式。

看看這個答案的步驟1-3:RSA Encrypt/Decrypt in Java。請記住使用正確的算法規格,對於您的情況PKCS1

很可能您的密文不會僅使用UTF-8字符,因此您可能希望使用Base 64編碼文本來顯示密文。 Base 64能夠顯示所有那些奇怪的字符ascii值。

只需使用:Base64.getEncoder().encodeToString(cipherTextBytes)

+0

我的問題是我不想生成密鑰。我的公鑰是這種形式:lyoXmyo7ZcnVZnI7rZcw5 ....我怎樣才能使用這種形式的公鑰? – Marzo

+1

@Marzo你首先必須弄清楚這個公鑰的格式是什麼。詢問你有這個的人,如果他們不知道,請索取產生它的代碼。你應該能夠從那裏去。 –

+0

我有密鑰的模數和指數,但我無法從我的java代碼初始化我的密鑰 – Marzo

0

我這樣做代碼:

 String pub = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4IJZLsjlx+o4RSvafaAcReoNnzrI0UXu7kZyXPe31ql32X9AvhC6QQIUmLkr1Evm0zP/SgVG9YX3DSqBUgPo04iv1I1/wNKwAf1/uH9EiiqdpczefyxxnzJiKUTcx2/4mA4E4QxCIL5JsZb78WoYZrd2kToW/WD01MnSFiCgSyjGdd812GY2EVzfvlv8kYuti3icMUyitEfHhtw8cAWI6/nVrRPNs0e5NsvtZJ0nfrXsfQDR0C7+ivQK+fQabi8oRGsbTZceAvVlqVE669zoIwIFLcB+eYXTxbka4E7veUMpaF9w//HdwVS2y/2jJiI+16qPStQQPIKQ4Cucoif7/UHfIBuVGVJ5MIVyK7NC7TV/lyoXmyo7ZcnVZnI7rZcw5/qZcqaZ0VCrzvHijwTK7100hOOjiarvRa2OJGXHLIeAUlbrHOXEXS6ah2glPhLDEg6Qzp/lKVSISolal7q73qyhF483P9jXn3hefSLA9J1/1LgeajWvuVkxuw+dy2Tlv7oUpNBkX47/TOho5qttr1y9K3hD5Q87RAJPdBtFdDbY8qUPxoiBsTbUWjVoEjJf2YAsLTJIIi2ZISkbD/VdrtZnS73QSJkJReOMNT9XYNGDJvwNIrRcNGFKlJcX6qq+ozGNsDkrt0ObxAD7YCTjAYQVTlbQOaTu5DbGxGDNCoMCAwEAAQ=="; 

     KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
     byte[] keyBytes = Base64.getDecoder().decode(pub.getBytes("UTF-8")); 
     PKCS1EncodedKeySpec KeySpec = new PKCS1EncodedKeySpec(keyBytes); 
     RSAPublicKey publicKey = (RSAPublicKey)keyFactory.generatePublic((java.security.spec.KeySpec) KeySpec); 

     Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, publicKey); 

     byte[] cipherData = cipher.doFinal(text.getBytes("UTF-8")); 


     return cipherData; 

但它亙古不變的工作.. 據說無效DER:對象不是整數

相關問題