精华内容
下载资源
问答
  • Java-RSA-加密-示例 这是让谁知道从未听说过使用 Java 进行 RSA 加密的示例。 编译 在 bash 中mkdir bin find src/ -name "*.java" -type f -exec javac -classpath bin {} -d bin \; (再来一次)
  • JAVA实现RSA加密

    2018-08-23 11:34:26
    JAVA 实现RSA的加解密算法,通过BASE64编码,密钥长度1024
  • java和js rsa加密支持超长的加密方式,后台使用java前端使用的是js
  • RSA加密 Java实现

    2018-04-20 11:02:44
    RSA加密 Java实现,RSA加密 Java实现,RSA加密 Java实现
  • 1. 介绍RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时...

    1. 介绍

    RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

    2. 具体实现

    密钥可以是字节数组,也可以是Base64编码过的。加密后对数据的输出采用2种方式:Base64、Hex,其中Base64使用的是Android SDK里面的API,具体代码如下:

    package com.fantasy.blogdemo.crypto.utils;

    import android.util.Base64;

    import com.fantasy.blogdemo.utils.ConvertUtils;

    import java.security.Key;

    import java.security.KeyFactory;

    import java.security.spec.PKCS8EncodedKeySpec;

    import java.security.spec.X509EncodedKeySpec;

    import javax.crypto.Cipher;

    /**

    * RSA加解密工具类

    *

    
     

    * author : Fantasy

    * version : 1.0, 2019-08-25

    * since : 1.0, 2019-08-25

    *

    */

    public class RSAUtils {

    private static final String CHARSET = "UTF-8";

    /**

    * 加密,输出Base64字符串密文

    *

    * @param data 明文

    * @param publicKey 公钥

    * @param keySize 公钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 密文

    */

    public static String encryptBase64(String data, byte[] publicKey, int keySize, String transformation) {

    try {

    return Base64.encodeToString(handle(data.getBytes(CHARSET), publicKey, keySize, transformation,

    true), Base64.NO_WRAP);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 加密,输出Base64字符串密文

    *

    * @param data 明文

    * @param publicKey 公钥(Base64字符串)

    * @param keySize 公钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 密文

    */

    public static String encryptBase64(String data, String publicKey, int keySize, String transformation) {

    try {

    return Base64.encodeToString(handle(data.getBytes(CHARSET), Base64.decode(publicKey, Base64.NO_WRAP),

    keySize, transformation, true), Base64.NO_WRAP);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 加密,输出十六进制字符串密文

    *

    * @param data 明文

    * @param publicKey 公钥

    * @param keySize 公钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 密文

    */

    public static String encryptHex(String data, byte[] publicKey, int keySize, String transformation) {

    try {

    return ConvertUtils.bytesToHexString(handle(data.getBytes(CHARSET), publicKey, keySize,

    transformation, true));

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 加密,输出十六进制字符串密文

    *

    * @param data 明文

    * @param publicKey 公钥(Base64字符串)

    * @param keySize 公钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 密文

    */

    public static String encryptHex(String data, String publicKey, int keySize, String transformation) {

    try {

    return ConvertUtils.bytesToHexString(handle(data.getBytes(CHARSET),

    Base64.decode(publicKey, Base64.NO_WRAP), keySize, transformation, true));

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 解密,密文为Base64字符串

    *

    * @param data 密文

    * @param privateKey 私钥

    * @param keySize 私钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 明文

    */

    public static String decryptBase64(String data, byte[] privateKey, int keySize, String transformation) {

    try {

    return new String(handle(Base64.decode(data, Base64.NO_WRAP), privateKey, keySize,

    transformation, false), CHARSET);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 解密,密文为Base64字符串

    *

    * @param data 密文

    * @param privateKey 私钥(Base64字符串)

    * @param keySize 私钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 明文

    */

    public static String decryptBase64(String data, String privateKey, int keySize, String transformation) {

    try {

    return new String(handle(Base64.decode(data, Base64.NO_WRAP), Base64.decode(privateKey, Base64.NO_WRAP),

    keySize, transformation, false), CHARSET);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 解密,密文为十六进制字符串

    *

    * @param data 密文

    * @param privateKey 私钥

    * @param keySize 私钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 明文

    */

    public static String decryptHex(String data, byte[] privateKey, int keySize, String transformation) {

    try {

    return new String(handle(ConvertUtils.hexStringToBytes(data), privateKey, keySize, transformation, false), CHARSET);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 解密,密文为十六进制字符串

    *

    * @param data 密文

    * @param privateKey 私钥(Base64字符串)

    * @param keySize 私钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @return 明文

    */

    public static String decryptHex(String data, String privateKey, int keySize, String transformation) {

    try {

    return new String(handle(ConvertUtils.hexStringToBytes(data), Base64.decode(privateKey, Base64.NO_WRAP),

    keySize, transformation, false), CHARSET);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return null;

    }

    /**

    * 处理数据,加密或解密

    *

    * @param data 数据

    * @param key 密钥

    * @param keySize 密钥大小,举例:1024, 2048...

    * @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:RSA/None/PKCS1Padding

    * 相关取值可以查看下列两个文档:

    *

    *

    JavaSE 8 API

    * 中的 javax.crypto.Cipher

    *

    * Standard Algorithm Name Documentation

    *

    * @param isEncrypt 如果是加密,则为true;如果为解密,则为false

    * @return 加密后或解密后的字节数组

    * @throws Exception 异常

    */

    private static byte[] handle(byte[] data, byte[] key, int keySize, String transformation,

    boolean isEncrypt) throws Exception {

    Key rsaKey;

    if (isEncrypt) {

    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(key);

    rsaKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);

    } else {

    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key);

    rsaKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

    }

    Cipher cipher = Cipher.getInstance(transformation);

    cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, rsaKey);

    int len = data.length;

    int maxLen = keySize / 8;

    if (isEncrypt) {

    String lowerTrans = transformation.toLowerCase();

    if (lowerTrans.endsWith("pkcs1padding")) {

    maxLen -= 11;

    }

    }

    int count = len / maxLen;

    if (count > 0) {

    byte[] ret = new byte[0];

    byte[] buff = new byte[maxLen];

    int index = 0;

    for (int i = 0; i < count; i ) {

    System.arraycopy(data, index, buff, 0, maxLen);

    ret = joins(ret, cipher.doFinal(buff));

    index = maxLen;

    }

    if (index != len) {

    int restLen = len - index;

    buff = new byte[restLen];

    System.arraycopy(data, index, buff, 0, restLen);

    ret = joins(ret, cipher.doFinal(buff));

    }

    return ret;

    } else {

    return cipher.doFinal(data);

    }

    }

    /**

    * 合并两个字节数组

    *

    * @param prefix 前一个字节数组

    * @param suffix 后一个字节数组

    * @return 字节数组

    */

    private static byte[] joins(byte[] prefix, byte[] suffix) {

    byte[] ret = new byte[prefix.length suffix.length];

    System.arraycopy(prefix, 0, ret, 0, prefix.length);

    System.arraycopy(suffix, 0, ret, prefix.length, suffix.length);

    return ret;

    }

    }

    3.使用方式

    举例:使用"RSA/None/PKCS1Padding"模式,公钥和密钥都是Base64字符串,密钥长度为1024,输出的密文为Base64字符串

    String transformation = "RSA/None/PKCS1Padding";

    String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDhSzPPnFn41iaz t4tI4kbaXNuNFOsI8hFeCYtlwPFKRbETHbBS10bMvUbOWLFtRgZV3L924GQ9orbomEmJ1nWyaSO8iBbZAyiWUP5PJJh/b9kHj1MMwG712bGfYYPdjkRprNpzU9w4UBzUMKKUoHU4c/Gbb4XeBK9LNTPWQL4YwIDAQAB";

    String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOFLM8 cWfjWJrP63i0jiRtpc240U6wjyEV4Ji2XA8UpFsRMdsFLXRsy9Rs5YsW1GBlXcv3bgZD2ituiYSYnWdbJpI7yIFtkDKJZQ/k8kmH9v2QePUwzAbvXZsZ9hg92ORGms2nNT3DhQHNQwopSgdThz8Ztvhd4Er0s1M9ZAvhjAgMBAAECgYEAxwNLTUXsJGfn4Gzm/jC52MEZ mu2zgT90IAGGZeg PUG63gwHyeXo4MsCVRz7/m8xAX/ykew IEQwFt8Pdvc rrs5yml4gOBPfhpau5QaI75xNjnyH7UA3mbRCZeyZrvuKqtY/f8pCgzy3EBWnRpkcsqeE6bsOQrD45mltr 0QECQQDynvhKEh hD5xBpF/DIP8Fp6fizexHdA6 aZT/gLaFA4XgZ9HEDDBhvNdadyYUNOLWhkxRHv6CkT5azfLXsJEhAkEA7begtbBCDXDf1 DRh3j2S8zcv6 utYgcpjvxZqjbPi6UIWXLxI80PIwQ0uouHCUMjikBA6VX9vTbw9TZ/IelAwJBAKI3W7baiz86mrTg3A4w/5GeWQexuurDVCBHo5F5U493nYk oOe9ZpPSmQIpa9JS0d xB1GtsWlHBzPbQySnL0ECQACjqvT1QTl6EbPXwp92eqQtQmQMbNW4RiaUjlpyrVs5zkAho1T9EyMqJPNI71n6VVa/8k8WxyAdkZ7ZlBikCQEkNe1 sAKnh AFGCJ 6WAq1J2RuIgcA6bVL3ip7F2NHdE N tR9JqWw3JNCweWmAlzKIGs6eKSVD5egzKaLXss=";

    String data = "blogDemo123"; // 待加密的数据

    // 公钥加密,输出Base64字符串

    String result1 = RSAUtils.encryptBase64(data, publicKey, 1024, transformation);;

    // 私钥解密

    String result2 = RSAUtils.decryptBase64(result1, privateKey, 1024, transformation);

    想看更多例子可以到我的GitHub上面看看BlogDemo。

    来源:https://www.icode9.com/content-1-410451.html

    展开全文
  • RSA加密算法,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。...加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开...本资源是通过Android、java实现的RSA加密的例子,可供大家参考学习。
  • 提供了rsa算法的java类及测试代码.其中已经用过,有需要的可以拿去
  • C#与java平台RSA加密解密签名验签互通案例,解决RSA在C#与java加密算法不同导致验签不过情况
  • 本资源实现前端加密Java后端加密。本资源出自他人整合。
  • Java实现RSA加密解密,数字证书生成与验证,模拟两个端通信,AB双方通信,客户端A把需要传输的文件MD5值用自己的私钥生成数字签名,连同明文用服务端B的公钥加密后传送给服务端B,服务端B用私钥解密验证数字签名,并计算...
  • javaRSA加密C++RSA解密

    2017-11-28 16:32:04
    Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍 项目: JAVA生成的RSA的密文,通过C++来解密。 RSA这里就不多介绍了大家自己去看。 JAVA也是通过包来实现加密和解密的,那么我的C++是通过OPENSSL的库来实现的...
  • java_RSA2048加密解密.zip

    2019-09-12 10:23:56
    前端js加密, 后端java解密,引用项目工程里面js、java代码到自己工程里面即可,使用方便, 可以自行生成密钥
  • RSA
  • JAVARSA加密解密工具类加强版

    热门讨论 2015-07-14 09:46:29
    博客地址 http://blog.csdn.net/sbsujjbcy/article/details/46873403
  • JAVA RSA 加密算法 RSA.java RSA公钥加解密,RSA私钥加解密,MD5withRSA 签名 MD5withRSA签名较验
  • RSA加密登录java实现

    2016-12-11 21:30:22
    做了一个简单的RSA加密登录的demo,用java实现
  • JAVARSA加密解密工具类
  • Js Java Rsa 加密解密

    2018-02-01 12:19:34
    Js Java Rsa 加密解密,具体用法请看blog,里面包含js库,java jar包,和一个别人写的可以完成加密解密的demo
  • C#RSA加密JAVA解密,实现相互通信,对字符进行加密,java解密,对密文字节进行编码
  • 给大家分享java使用RSA加密方式实现数据加密解密,通过实例代码文字相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下
  • java实现RSA加密

    2021-03-08 22:03:32
    import org.apache.commons.codec.binary.Base64;import java.security.*;import java.security.spec.PKCS8...public class RSA{public static final String SIGN_ALGORITHMS = "SHA1WithRSA";public st...

    import org.apache.commons.codec.binary.Base64;

    import java.security.*;

    import java.security.spec.PKCS8EncodedKeySpec;

    public class RSA{

    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";

    public static void main(String[] args) throws Exception {

    String content = "study hard and make progress everyday";

    System.out.println("content :"+content);

    KeyPair keyPair = getKeyPair();

    System.out.println("keyPair =============== " + keyPair);

    PublicKey publicKey = keyPair.getPublic();

    PrivateKey privateKey = keyPair.getPrivate();

    System.out.println("publicKey ================== " + publicKey);

    System.out.println("privateKey ================== " + privateKey);

    // String md5Sign = getMd5Sign(content,privateKey);

    // System.out.println("sign with md5 and rsa :"+ md5Sign);

    // boolean md5Verifty = verifyWhenMd5Sign(content,md5Sign,publicKey);

    // System.out.println("verify sign with md5 and rsa :"+ md5Verifty);

    String sha1Sign = getSha1Sign(content,privateKey);

    System.out.println("sign with sha1 and rsa :"+ sha1Sign);

    boolean sha1Verifty = verifyWhenSha1Sign(content,sha1Sign,publicKey);

    System.out.println("verify sign with sha1 and rsa :"+ sha1Verifty);

    }

    //生成密钥对

    static KeyPair getKeyPair() throws Exception {

    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");

    keyGen.initialize(512); //可以理解为:加密后的密文长度,实际原文要小些 越大 加密解密越慢

    KeyPair keyPair = keyGen.generateKeyPair();

    return keyPair;

    }

    //用md5生成内容摘要,再用RSA的私钥加密,进而生成数字签名

    static String getMd5Sign(String content , PrivateKey privateKey) throws Exception {

    byte[] contentBytes = content.getBytes("utf-8");

    Signature signature = Signature.getInstance("MD5withRSA");

    signature.initSign(privateKey);

    signature.update(contentBytes);

    byte[] signs = signature.sign();

    return Base64.encodeBase64String(signs);

    }

    //对用md5和RSA私钥生成的数字签名进行验证

    static boolean verifyWhenMd5Sign(String content, String sign, PublicKey publicKey) throws Exception {

    byte[] contentBytes = content.getBytes("utf-8");

    Signature signature = Signature.getInstance("MD5withRSA");

    signature.initVerify(publicKey);

    signature.update(contentBytes);

    return signature.verify(Base64.decodeBase64(sign));

    }

    //用sha1生成内容摘要,再用RSA的私钥加密,进而生成数字签名

    static String getSha1Sign(String content , PrivateKey privateKey) throws Exception {

    byte[] contentBytes = content.getBytes("utf-8");

    Signature signature = Signature.getInstance("SHA1withRSA");

    signature.initSign(privateKey);

    signature.update(contentBytes);

    byte[] signs = signature.sign();

    return Base64.encodeBase64String(signs);

    }

    //对用md5和RSA私钥生成的数字签名进行验证

    static boolean verifyWhenSha1Sign(String content, String sign, PublicKey publicKey) throws Exception {

    byte[] contentBytes = content.getBytes("utf-8");

    Signature signature = Signature.getInstance("SHA1withRSA");

    signature.initVerify(publicKey);

    signature.update(contentBytes);

    return signature.verify(Base64.decodeBase64(sign));

    }

    /**

    * RSA签名

    * @param content 待签名数据

    * @param privateKey 商户私钥

    * @param input_charset 编码格式

    * @return 签名值

    */

    public static String sign(String content, String privateKey, String input_charset)

    {

    try

    {

    PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decodeBase64(privateKey) );

    KeyFactory keyf = KeyFactory.getInstance("RSA");

    PrivateKey priKey = keyf.generatePrivate(priPKCS8);

    java.security.Signature signature = java.security.Signature

    .getInstance(SIGN_ALGORITHMS);

    signature.initSign(priKey);

    signature.update( content.getBytes(input_charset) );

    byte[] signed = signature.sign();

    return Base64.encodeBase64String(signed);

    }

    catch (Exception e)

    {

    e.printStackTrace();

    }

    return null;

    }

    }

    展开全文
  • Java实现RSA加密

    2021-02-12 09:06:11
    packagecom.my;importorg.apache.commons.codec.binary.Base64;importorg.apache.commons.io.IOUtils;importjavax.crypto.Cipher;importjava.io.ByteArrayOutputStream;...importjava.security....

    packagecom.my;importorg.apache.commons.codec.binary.Base64;importorg.apache.commons.io.IOUtils;importjavax.crypto.Cipher;importjava.io.ByteArrayOutputStream;import java.security.*;importjava.security.interfaces.RSAPrivateKey;importjava.security.interfaces.RSAPublicKey;importjava.security.spec.InvalidKeySpecException;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.util.HashMap;importjava.util.Map;public classRSAUtils {public static final String CHARSET = "UTF-8";public static final String RSA_ALGORITHM = "RSA"; //ALGORITHM ['ælgərɪð(ə)m] 算法的意思

    public static Map createKeys(intkeySize) {//为RSA算法创建一个KeyPairGenerator对象

    KeyPairGenerator kpg;try{

    kpg=KeyPairGenerator.getInstance(RSA_ALGORITHM);

    }catch(NoSuchAlgorithmException e) {throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");

    }//初始化KeyPairGenerator对象,密钥长度

    kpg.initialize(keySize);//生成密匙对

    KeyPair keyPair =kpg.generateKeyPair();//得到公钥

    Key publicKey =keyPair.getPublic();

    String publicKeyStr=Base64.encodeBase64URLSafeString(publicKey.getEncoded());//得到私钥

    Key privateKey =keyPair.getPrivate();

    String privateKeyStr=Base64.encodeBase64URLSafeString(privateKey.getEncoded());//map装载公钥和私钥

    Map keyPairMap = new HashMap();

    keyPairMap.put("publicKey", publicKeyStr);

    keyPairMap.put("privateKey", privateKeyStr);//返回map

    returnkeyPairMap;

    }/*** 得到公钥

    *@parampublicKey 密钥字符串(经过base64编码)

    *@throwsException*/

    public static RSAPublicKey getPublicKey(String publicKey) throwsNoSuchAlgorithmException, InvalidKeySpecException {//通过X509编码的Key指令获得公钥对象

    KeyFactory keyFactory =KeyFactory.getInstance(RSA_ALGORITHM);

    X509EncodedKeySpec x509KeySpec= newX509EncodedKeySpec(Base64.decodeBase64(publicKey));

    RSAPublicKey key=(RSAPublicKey) keyFactory.generatePublic(x509KeySpec);returnkey;

    }/*** 得到私钥

    *@paramprivateKey 密钥字符串(经过base64编码)

    *@throwsException*/

    public static RSAPrivateKey getPrivateKey(String privateKey) throwsNoSuchAlgorithmException, InvalidKeySpecException {//通过PKCS#8编码的Key指令获得私钥对象

    KeyFactory keyFactory =KeyFactory.getInstance(RSA_ALGORITHM);

    PKCS8EncodedKeySpec pkcs8KeySpec= newPKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));

    RSAPrivateKey key=(RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);returnkey;

    }/*** 公钥加密

    *@paramdata

    *@parampublicKey

    *@return

    */

    public staticString publicEncrypt(String data, RSAPublicKey publicKey) {try{

    Cipher cipher=Cipher.getInstance(RSA_ALGORITHM);

    cipher.init(Cipher.ENCRYPT_MODE, publicKey);returnBase64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));

    }catch(Exception e) {throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);

    }

    }/*** 私钥解密

    *@paramdata

    *@paramprivateKey

    *@return

    */

    public staticString privateDecrypt(String data, RSAPrivateKey privateKey) {try{

    Cipher cipher=Cipher.getInstance(RSA_ALGORITHM);

    cipher.init(Cipher.DECRYPT_MODE, privateKey);return newString(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);

    }catch(Exception e) {throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);

    }

    }/*** 私钥加密

    *@paramdata

    *@paramprivateKey

    *@return

    */

    public staticString privateEncrypt(String data, RSAPrivateKey privateKey) {try{

    Cipher cipher=Cipher.getInstance(RSA_ALGORITHM);//每个Cipher初始化方法使用一个模式参数opmod,并用此模式初始化Cipher对象。此外还有其他参数,包括密钥key、包含密钥的证书certificate、算法参数params和随机源random。

    cipher.init(Cipher.ENCRYPT_MODE, privateKey);returnBase64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), privateKey.getModulus().bitLength()));

    }catch(Exception e) {throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);

    }

    }/*** 公钥解密

    *@paramdata

    *@parampublicKey

    *@return

    */

    public staticString publicDecrypt(String data, RSAPublicKey publicKey) {try{

    Cipher cipher=Cipher.getInstance(RSA_ALGORITHM);

    cipher.init(Cipher.DECRYPT_MODE, publicKey);return newString(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), CHARSET);

    }catch(Exception e) {throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);

    }

    }//rsa切割解码 , ENCRYPT_MODE,加密数据 ,DECRYPT_MODE,解密数据

    private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, intkeySize) {int maxBlock = 0; //最大块

    if (opmode ==Cipher.DECRYPT_MODE) {

    maxBlock= keySize / 8;

    }else{

    maxBlock= keySize / 8 - 11;

    }

    ByteArrayOutputStream out= newByteArrayOutputStream();int offSet = 0;byte[] buff;int i = 0;try{while (datas.length >offSet) {if (datas.length - offSet >maxBlock) {//可以调用以下的doFinal()方法完成加密或解密数据:

    buff =cipher.doFinal(datas, offSet, maxBlock);

    }else{

    buff= cipher.doFinal(datas, offSet, datas.length -offSet);

    }

    out.write(buff,0, buff.length);

    i++;

    offSet= i *maxBlock;

    }

    }catch(Exception e) {throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e);

    }byte[] resultDatas =out.toByteArray();

    IOUtils.closeQuietly(out);returnresultDatas;

    }//简单测试____________

    public static void main(String[] args) throwsException {

    Map keyMap = RSAUtils.createKeys(1024);

    String publicKey= keyMap.get("publicKey");

    String privateKey= keyMap.get("privateKey");

    System.out.println("公钥: \n\r" +publicKey);

    System.out.println("私钥: \n\r" +privateKey);

    System.out.println("公钥加密——私钥解密");

    String str= "站在大明门前守卫的禁卫军,事先没有接到\n" + "有关的命令,但看到大批盛装的官员来临,也就\n" + "以为确系举行大典,因而未加询问。进大明门即\n" + "为皇城。文武百官看到端门午门之前气氛平静,\n" + "城楼上下也无朝会的迹象,既无几案,站队点名\n" + "的御史和御前侍卫“大汉将军”也不见踪影,不免\n"

    + "心中揣测,互相询问:所谓午朝是否讹传?";

    System.out.println("\r明文:\r\n" +str);

    System.out.println("\r明文大小:\r\n" +str.getBytes().length);

    String encodedData= RSAUtils.publicEncrypt(str, RSAUtils.getPublicKey(publicKey)); //传入明文和公钥加密,得到密文

    System.out.println("密文:\r\n" +encodedData);

    String decodedData= RSAUtils.privateDecrypt(encodedData, RSAUtils.getPrivateKey(privateKey)); //传入密文和私钥,得到明文

    System.out.println("解密后文字: \r\n" +decodedData);

    }

    }

    展开全文
  • Java 生成RSA密钥进行数据加密解密 支持超长字符分区 ,同时支持本地读取生成的密钥文件和远程服务器上存放的秘钥文件
  • RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 这时一个简单的Java实现,在RSA网络安全工具类是比较完整的实现。
  • RSA加密算法实现以及C#与java互通加解密,解决RSA算法在java与C#相互通用
  • asp.net RSA 私钥加密公钥解密 能解 php Java 实现RSA加密互通 ,PKCS#8 格式的的密钥文件 ,公钥解密 依赖于BouncyCastle.Crypto.dll
  • Java实现RSA加密工具类

    2021-02-25 19:34:06
    公钥加密算法,也就是 非对称加密算法,这种算法加密和解密的密码不一样,一个是公钥,另一个是私钥:公钥和私钥成对出现公开的密钥叫公钥,只有自己知道的叫私钥用公钥加密的数据只有对应的私钥可以解密用私钥加密...

    公钥加密算法,也就是 非对称加密算法,这种算法加密和解密的密码不一样,一个是公钥,另一个是私钥:

    公钥和私钥成对出现

    公开的密钥叫公钥,只有自己知道的叫私钥

    用公钥加密的数据只有对应的私钥可以解密

    用私钥加密的数据只有对应的公钥可以解密

    如果可以用公钥解密,则必然是对应的私钥加的密

    如果可以用私钥解密,则必然是对应的公钥加的密

    公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。

    代码如下

    package com.cxy.template.controller.keyTools;

    import java.util.Base64;

    import javax.crypto.Cipher;

    import java.security.KeyFactory;

    import java.security.KeyPair;

    import java.security.KeyPairGenerator;

    import java.security.NoSuchAlgorithmException;

    import java.security.SecureRandom;

    import java.security.interfaces.RSAPrivateKey;

    import java.security.interfaces.RSAPublicKey;

    import java.security.spec.PKCS8EncodedKeySpec;

    import java.security.spec.X509EncodedKeySpec;

    import java.util.HashMap;

    import java.util.Map;

    /**

    * Java RSA 加密工具类

    *

    */

    public class RSAUtils {

    /**

    * 密钥长度 于原文长度对应 以及越长速度越慢

    */

    private final static int KEY_SIZE = 1024;

    /**

    * 用于封装随机产生的公钥与私钥

    */

    private static Map keyMap = new HashMap();

    /**

    * 随机生成密钥对

    */

    public static void genKeyPair() throws NoSuchAlgorithmException {

    // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象

    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");

    // 初始化密钥对生成器

    keyPairGen.initialize(KEY_SIZE, new SecureRandom());

    // 生成一个密钥对,保存在keyPair中

    KeyPair keyPair = keyPairGen.generateKeyPair();

    // 得到私钥

    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

    // 得到公钥

    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

    String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());

    // 得到私钥字符串

    String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());

    // 将公钥和私钥保存到Map

    //0表示公钥

    keyMap.put(0, publicKeyString);

    //1表示私钥

    keyMap.put(1, privateKeyString);

    }

    /**

    * RSA公钥加密

    *

    * @param str 加密字符串

    * @param publicKey 公钥

    * @return 密文

    * @throws Exception 加密过程中的异常信息

    */

    public static String encrypt(String str, String publicKey) throws Exception {

    //base64编码的公钥

    byte[] decoded = Base64.getDecoder().decode(publicKey);

    RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));

    //RSA加密

    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.ENCRYPT_MODE, pubKey);

    String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));

    return outStr;

    }

    /**

    * RSA私钥解密

    *

    * @param str 加密字符串

    * @param privateKey 私钥

    * @return 明文

    * @throws Exception 解密过程中的异常信息

    */

    public static String decrypt(String str, String privateKey) throws Exception {

    //64位解码加密后的字符串

    byte[] inputByte = Base64.getDecoder().decode(str);

    //base64编码的私钥

    byte[] decoded = Base64.getDecoder().decode(privateKey);

    RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));

    //RSA解密

    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.DECRYPT_MODE, priKey);

    String outStr = new String(cipher.doFinal(inputByte));

    return outStr;

    }

    public static void main(String[] args) throws Exception {

    long temp = System.currentTimeMillis();

    //生成公钥和私钥

    genKeyPair();

    //加密字符串

    System.out.println("公钥:" + keyMap.get(0));

    System.out.println("私钥:" + keyMap.get(1));

    System.out.println("生成密钥消耗时间:" + (System.currentTimeMillis() - temp) / 1000.0 + "秒");

    //客户id + 授权时间 + 所用模块

    String message = "4028138151b3cf300151b419df090007" + "2015-12-17 11:30:22" + "A01,A02";

    System.out.println("原文:" + message);

    temp = System.currentTimeMillis();

    //通过原文,和公钥加密。

    String messageEn = encrypt(message, keyMap.get(0));

    System.out.println("密文:" + messageEn);

    System.out.println("加密消耗时间:" + (System.currentTimeMillis() - temp) / 1000.0 + "秒");

    temp = System.currentTimeMillis();

    //通过密文,和私钥解密。

    String messageDe = decrypt(messageEn, keyMap.get(1));

    System.out.println("解密:" + messageDe);

    System.out.println("解密消耗时间:" + (System.currentTimeMillis() - temp) / 1000.0 + "秒");

    }

    }

    测试如下

    公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtI8/X2ayQNXsz6/HTJew8z86+aevsJJLNS5dT74/zUwfaOpouInMQLwhqLFvMoCIzw2CLdG7/hwx3HGlKTHDpaTCqnKu17NVOriI8o7lAgI6pK/L2M8kpkbAG88XBmH6aNbi94TS1/ljsS9jMNoEQvfLC2A/KUw9sopRg73gAawIDAQAB

    私钥:MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAK0jz9fZrJA1ezPr8dMl7DzPzr5p6+wkks1Ll1Pvj/NTB9o6mi4icxAvCGosW8ygIjPDYIt0bv+HDHccaUpMcOlpMKqcq7Xs1U6uIjyjuUCAjqkr8vYzySmRsAbzxcGYfpo1uL3hNLX+WOxL2Mw2gRC98sLYD8pTD2yilGDveABrAgMBAAECgYAvHh7S5AcFG7jSkXQ2/QwEJJ1jzlmI4w8cVWTyT7CCDGeHqQkKYw+jKNmGY1n8HtwP8CyW5vHKEkt/Irk4ogLb39DHPNbBVrhCn6HbPR/1RdcU3kOWsFnZ8tjx5lxJhP3bSA0J1V2tk/QlZ74RoKMDK59zp2dyjqoqaVIlj7dbaQJBANLPDOGrtIs6n6FcxmGggg5Hy+ajYIxJVcv2yoUfg59Rg3Q/X4QbrxU0NQ4+q/dSZfFSCDJ9lpvJWuO4hZI1MG8CQQDSQYjdlBOePY0pgDE+0jfPh0J5c6Ctyvq7nrps7JsrJpF/FUurUZFCBq63UMIlxFKZuGisngthUBKkkanuiXXFAkEAlBMfxzxm2w1Yp22VY2ntML65uM21uZShkV1Or+eM+tG09mi1XQRdHRXI1rKq9FSKitHGNEEHE3KCR0aLfEGkPQJAK+xq5jc3/ffH1KKmJwSNijoshejE6WmdBbL8KSMoq1QMUyskuq54lP2GZF9nn7Iqu1hN7bm6kOLEckLH6EApLQJBAJkuPP4kB1moPecwPjoW62oNWvdTK59tGHdvVDclnnpbWNurSp63zNGyowmzZn4MaEUduliU9ZuA+g3BuRXnTQo=

    生成密钥消耗时间:0.129秒

    原文:4028138151b3cf300151b419df0900072015-12-17 11:30:22A01,A02

    密文:DnNGSArBjHQ46uyP9aBBs/f+zGwbpM2suh39Imdqu1ebUyCdB6b1AYB8Y7snklttm++EQjrKO8B+06er0+bOJb8lXbHQrvDkFCbcp31TiCBeITZT8bWpHQfwVmutVYKCYGwuk2E5VXQfSySuh6ZsUX/M/3UfS9MvKbQB3d1dyJ8=

    加密消耗时间:0.217秒

    解密:4028138151b3cf300151b419df0900072015-12-17 11:30:22A01,A02

    解密消耗时间:0.003秒

    Process finished with exit code 0

    以上就是Java实现RSA加密工具类的详细内容,更多关于Java RSA加密工具类的资料请关注脚本之家其它相关文章!

    展开全文
  • 使用RSA非对称加密完成Java后端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,由于RSA的特性,一个1024位的密钥只能加密117位字节数据,当数据量超过117位字节的时候,程序...
  • JAVA实现RSA加密解密

    2021-03-01 06:54:42
    RSA 工具类。提供 加密 , 解密 ,生成密钥对等方法。 RSA 加密 原理概述 : RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数...RSA加密原理概述 :RSA的安全性依赖于大数的分解,公钥和私钥都是两个大素数(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,719
精华内容 16,287
关键字:

java进行rsa加密

java 订阅