RSA非對稱加密解密Java實例代碼

ne3g 10年前發布 | 3K 次閱讀 Java

String content = "";
for(int i=1;i<100;i++)content += i + ") Easy to say, hard to do.\n";

/1、利用公鑰加密至文件/ { /1)根據公鑰反向構造PublickKey對象,調用cipher的init方法時使用/ String KEY_PUBLIC = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIv38xXk06As11OCWq0IPQoQAmz20ZiE8T5KeaMTUbhzUkGNTAQygApua71R/INeEDNsyyQS4PT6EaWTjJop2rcCAwEAAQ=="; X509EncodedKeySpec keySpec = new X509EncodedKeySpec(new BASE64Decoder().decodeBuffer(KEY_PUBLIC)); PublicKey key = KeyFactory.getInstance("RSA").generatePublic(keySpec);

Cipher cipher = Cipher.getInstance("RSA");//RSA/ECB/PKCS1PADDING
cipher.init(Cipher.ENCRYPT_MODE, key);

/*
 * 直接加密,因為內容太長將有異常,需要分塊加密
 * javax.crypto.IllegalBlockSizeException: Data must not be longer than 53 bytes
 * cipher.doFinal(content.getBytes());
 */

/*2)分塊加密,與KeyPairGenerator.initialize(int keysize)有關,本例使用的keysize為512*/
int blockSize = 53;//cipher.getBlockSize()為0?根據異常提示設的53
byte[] encryptByte = content.getBytes();
//根據塊大小分塊,不足一塊的部分為一塊
int blocksNum = (int)Math.ceil((1.0*encryptByte.length)/blockSize);

FileOutputStream out = new FileOutputStream("license.lic");
for (int i = 0; i < blocksNum; i++) {
    if (i < blocksNum - 1) {
        out.write(cipher.doFinal(encryptByte, i * blockSize, blockSize));
    } else {
        out.write(cipher.doFinal(encryptByte, i * blockSize, encryptByte.length - i * blockSize));
    }
}

out.close();

}

/2、利用私鑰從文件解密/ { /1)根據私鑰反向構造PrivateKey對象/ String KEY_PRIVATE = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAi/fzFeTToCzXU4JarQg9ChACbPbRmITxPkp5oxNRuHNSQY1MBDKACm5rvVH8g14QM2zLJBLg9PoRpZOMminatwIDAQABAkBqDAR7FBJbC15hgSQecV194D9WO3L18dOt9FNQgPSroGVYIvIizp1/wIHpMTN6uHwSoaZQcOqV33gxLF6fKbwxAiEAv390Q3X2cBjeScxhNbqPiOspE9rYD3eWSajN6Q7ud7UCIQC7HTUZelHMCpv4xPzg6e1QZkWhBfuqkhg9aOeAnIW0OwIgLW5Tat3FhXqg4ek29sQ34UfJCwjUUXcRlJATqcL9GDECIQChqe+JzrxDbVsrCY9vB83JLEO2hwPUcJtO24dBAHsopwIgEV547YcgZ+pyI1dnQhiLJiiFif+h1aBzaIH5mrkshtw="; PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(KEY_PRIVATE)); PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

Cipher cipher = Cipher.getInstance("RSA");//RSA/ECB/PKCS1PADDING
cipher.init(Cipher.DECRYPT_MODE, key);

/*2)分塊解密,根據每塊加密輸出大小確定*/
FileInputStream cis = new FileInputStream("license.lic");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
/*加密時分塊加密,加密輸出結果大小固定*/
byte[] data = new byte[cipher.getOutputSize(cis.available())];
int len = 0;
while((len = cis.read(data)) > 0){
    bos.write(cipher.doFinal(data, 0, len));
}
cis.close();

System.out.print(new String(bos.toByteArray()));

}</pre>

 本文由用戶 ne3g 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!