jdk RSA算法类使用

package com.security.rsa;

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class RSACoder {

public static PublicKey getPublicKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = (new BASE64Decoder()).decodeBuffer(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}

public static PrivateKey getPrivateKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = (new BASE64Decoder()).decodeBuffer(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}

/**
* 得到密钥字符串(经过base64编码)
* @return
*/
public static String getKeyString(Key key) throws Exception {
byte[] keyBytes = key.getEncoded();
String s = (new BASE64Encoder()).encode(keyBytes);
return s;
}

public static void main(String[] args) throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//密钥位数
keyPairGen.initialize(1024);
//密钥对
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公钥
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私钥
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
String publicKeyString = getKeyString(publicKey);
System.out.println("public:\n" + publicKeyString);
String privateKeyString = getKeyString(privateKey);
System.out.println("private:\n" + privateKeyString);
//加解密类
Cipher cipher = Cipher.getInstance("RSA");//Cipher.getInstance("RSA/ECB/PKCS1Padding");
//明文
byte[] plainText = "91686280721609".getBytes();
//加密
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] enBytes = cipher.doFinal(plainText);
String s1 = new String(enBytes);
System.out.println("加密后的密文:" + s1);
//通过密钥字符串得到密钥
publicKey = getPublicKey(publicKeyString);
privateKey = getPrivateKey(privateKeyString);
//解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[]deBytes = cipher.doFinal(enBytes);
publicKeyString = getKeyString(publicKey);
System.out.println("public:\n" +publicKeyString);
privateKeyString = getKeyString(privateKey);
System.out.println("private:\n" + privateKeyString);
String s = new String(deBytes);
System.out.println(s);
}

}

时间: 2024-10-12 08:08:55

jdk RSA算法类使用的相关文章

数字签名算法--1.RSA算法代码

package Imooc; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.

RSA私钥加密研究

朋友碰到调用第三方API的加密问题,JAVA代码中用pfx私钥文件来加密字符串,流程如下: 输入私钥文件地址pfxPath.私钥密码pfxKey.被加密串dataContent dataContent转成base64串,使用sun.misc.BASE64Decoder包 用pfx私钥及PKCS12方式生成privateKey privateKey和RSA/ECB/PKCS1Padding加密方式生成加密字节数组,再转成十六进制字符串 需求是在.net程序中得到同样的加密字符串,常见方法如下: 使

RSA .net

这两天在捣鼓 RSA 加密的问题. WebService 一直使用的是明文传递账号密码.. 实在是受不了. 于是觉得还是加密一下. 由于一直没有使用过RSA,所以我提议用了RSA做. 然后就做了. 首先RSA是非对称加密. 会生成 密钥a 和 密钥b. 用a 加密 用b解密,反之亦然. 这样就解决了安全性问题. 至于RSA算法的原理. 可以去阮一峰的博客上看. 深入浅出.很是厉害. .net 自己有RSA加密的库,使用起来也比较简单. 生成公钥和私钥. //声明一个RSA算法的实例,由RSACr

PHP开发接口使用RSA进行加密解密方法

网络安全问题很重要,尤其是保证数据安全,遇到很多在写接口的程序员直接都是明文数据传输,在我看来这是很不专业的.本人提倡经过接口的数据都要进行加密解密之后进行使用. 这篇文章主要介绍使用PHP开发接口,数据实现RSA加密解密后使用,实例分析了PHP自定义RSA类实现加密与解密的技巧,非常具有实用价值,需要的朋友可以参考下. 简单介绍RSA: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新手对它不太了解.下面仅作简要介绍.RSA是第一个比较完善的公开密钥算法,它既

Java加解密与签名

加密.数字签名基本概念: 加密: 密码常用术语: 明文,密文,加密,加密算法,加密秘钥,解密,解密算法,解密秘钥,密码分析:分析密文从而推断出明文或秘钥的过程主动攻击:入侵密码系统,采用伪造,修改,删除等手段向系统注入假消息进行欺骗.(对密文有破坏作用)被动攻击:对一个保密系统采取截获密文并对其进行分析和攻击.(对密文没有破坏作用)密码体制:由明文/密文/密钥空间,加密算法和解密算法五部分构成密码协议:也称安全协议,以密码学为基础的消息交换通信协议密码系统:指用于加密.解密的系统.柯克霍夫原则:

php RAS加密类代码

通过openssl实现的签名.验签.非对称加解密,需要配合x.509证书(如crt和pem)文件使用. <?php /** * RSA算法类 * 签名及密文编码:base64字符串/十六进制字符串/二进制字符串流 * 填充方式: PKCS1Padding(加解密)/NOPadding(解密) * * Notice:Only accepts a single block. Block size is equal to the RSA key size! * 如密钥长度为1024 bit,则加密时数

比特币的加密算法

比特币加密算法一共有两类:非对称加密算法(椭圆曲线加密算法)和哈希算法(SHA256,RIMPED160算法). 比特币私钥(private key),公钥(public key),公钥哈希值(pubkeyhash),比特币地址(address)公钥和私钥由椭圆曲线加密算法生成,私钥可推出公钥而反之不能,这也是这篇文章后半部分要隆重介绍的部分.有了私钥,你就可以对文本签名.别人拿了你的公钥就可以根据签名认证你是否拥有私钥.这就是证明你拥有存款的办法.为了安全起见,公钥应该隐藏起来.所以对公钥进行

JDK自带方法实现RSA数字签名

JDK只支持MD2withRSA, MD5withRSA, SHA1withRSA 其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle) JDK的密钥长度默认仍是1024 1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.NoSuchAlgorithmException; 5 import java.security.Priv

JDK自带方法实现RSA对称加密

1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.Key; 5 import java.security.KeyFactory; 6 import java.security.KeyPair; 7 import java.security.KeyPairGenerator; 8 import java.security.NoSuchAlgorithmExcept