java rsa解密实例_RSA非对称加密解密实例

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 

if (i 

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()));

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对称加密算法是一种常用的加密方式,它采用了一对密钥,即公钥和私钥。公钥是公开的,可以任意分发,而私钥则只能由密钥的所有者持有,用于解密加密数据。常见的对称加密算法包括RSA、DSA、ECC等。 下面是一个使用RSA算法实现对称加密Java示例代码: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import javax.crypto.Cipher; public class RSAEncryptionExample { public static void main(String[] args) throws Exception { String input = "Hello World!"; KeyPair keyPair = generateRSAKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); byte[] encryptedData = rsaEncrypt(input.getBytes(), publicKey); byte[] decryptedData = rsaDecrypt(encryptedData, privateKey); System.out.println("Original data: " + input); System.out.println("Encrypted data: " + new String(encryptedData)); System.out.println("Decrypted data: " + new String(decryptedData)); } public static KeyPair generateRSAKeyPair() throws Exception { KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); generator.initialize(2048); // key size KeyPair keyPair = generator.generateKeyPair(); return keyPair; } public static byte[] rsaEncrypt(byte[] data, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedData = cipher.doFinal(data); return encryptedData; } public static byte[] rsaDecrypt(byte[] data, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedData = cipher.doFinal(data); return decryptedData; } } ``` 这个示例代码中,我们首先生成了一个RSA密钥对,包括公钥和私钥。然后使用公钥对原始数据进行加密,得到加密后的数据。接着使用私钥对加密后的数据进行解密,得到原始数据。 需要注意的是,RSA算法使用的密钥长度越长,安全性就越高,但加解密的速度也越慢。在实际应用中,需要根据实际需求和环境选择合适的密钥长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值