1.使用工具生成私有和公有秘钥

私有秘钥:

-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKxXRHhJ+wAZE7eP
GzEl5+Gm/Un9N6bpE4sKEwAraJtsEY/OnrxBWdyFUL3YddEn8MKqBn10elSbi/wV
1CFKEmdZR1U4Wu2RChGWQWSQTTewbc8ASDOHTKRzqcc/5d0AM0qNmS9sWOPkDmhB
tS2wnLgXn4G7P3iIvtgWuSYtJEyBAgMBAAECgYA0yGWIEeB2HzgSuBmz69AhJGvf
BVbOIASESQmYu7LGJ0sZqEalkb5b89jOzEUJUhpDBKAIPGxbDWjKREU8DNulmqiN
RpZxv5pyMVqUZt3P6Dzsd+VU6vgh8bJgF+ejx1t3xTxNigqU3XbJJrQzs4nCPem7
jxCqgT0e65Z0eTgSIQJBAN6o8T6MVNgT6SMR8IYUwaB6Pu8/OWENXrX4Db/ZCCRF
s8ODGyl/fbPz+sjfhGQ37wVc28ytl5B34YaJ5FiEx6MCQQDGJXuOa9McL5RaIGGN
tmKZU+xyWe4A8NlBxX8BopGHwr8VVZwwlXWYIUgO2z4QvKn0nsPRO4oDgW0DnfY6
fu2LAkA3nrYcrMto6phbVVji9X5kywS7mOyJbOCSzjMJEHrzLKI6HZ8EX7+T20dz
NDqLGlnP2iFh4J8yzG9+vyVWY1zHAkBeToi4CGm6CIs7Oh40LJJRF7h51IOKvxco
Tq9cP9u0GeSIau6j0P7fITgCmia4IJNjcg0REJ1nfbo89nmy7aZxAkEAuQ0aXnsE
YeLLbm6FHfwGTzEYMaewGTySLbhzNEbCBK3UNp3wJRCv/x1nhYn3g0EhcP/yIHGT
LkG1i1P9vgIGHg==
-----END PRIVATE KEY-----

公有秘钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsV0R4SfsAGRO3jxsxJefhpv1J
/Tem6ROLChMAK2ibbBGPzp68QVnchVC92HXRJ/DCqgZ9dHpUm4v8FdQhShJnWUdV
OFrtkQoRlkFkkE03sG3PAEgzh0ykc6nHP+XdADNKjZkvbFjj5A5oQbUtsJy4F5+B
uz94iL7YFrkmLSRMgQIDAQAB
-----END PUBLIC KEY-----

方式有有多种,最简洁的方式是在线生成工具: http://web.chacuo.net/netrsakeypair/

2.java加密解密算法

核心类如下:

BlendAR.java
/*** 混合AES RSA加密* Created by Administrator on 2017/3/25.*/
public class BlendAR {/*** 混合加密* @param body 加密正文* @return 0 密钥 1正文*/public static String[] blendEncrypt(String body){String[] bes = new String[2];try {//加载RSA公钥RSAPublicKey rsaPublicKey = RSA.loadPublicKey(BlendAR.class.getResourceAsStream("/rsa_public_key.pem"));//生成一个AES密钥String aesKey= AES.generateKeyString();//用RSA公钥加密AES的密钥String encryptAesKey = RSA.encryptByPublicKey(aesKey, rsaPublicKey);//再使用AES加密内容,传给服务器String encryptContent = AES.encrypt(body, aesKey);bes[0] = encryptAesKey;bes[1] = encryptContent;} catch (Exception e) {e.printStackTrace();}return bes;}public static String blendDecrypt(String[] mix){String decryptBody = "";//加载私钥try {RSAPrivateKey privateKey = RSA.loadPrivateKey(BlendAR.class.getResourceAsStream("/rsa_private_key_pkcs8.pem"));//解密AES-KEYString decryptAesKey = RSA.decryptByPrivateKey(mix[0], privateKey);//AES解密数据decryptBody = AES.decrypt(mix[1], decryptAesKey);} catch (Exception e) {e.printStackTrace();}return decryptBody;}}

工具类如下:

/*** 用于java平台的AES加密解密*/
public class AES {// /** 算法/模式/填充 **/private static final String CipherMode = "AES/ECB/PKCS5Padding";// private static final String CipherMode = "AES";/*** 生成一个AES密钥对象* @return*/public static SecretKeySpec generateKey(){try {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128, new SecureRandom());  SecretKey secretKey = kgen.generateKey();  byte[] enCodeFormat = secretKey.getEncoded();  SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");return key;} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}/*** 生成一个AES密钥字符串* @return*/public static String generateKeyString(){return byte2hex(generateKey().getEncoded());}/*** 加密字节数据* @param content* @param key* @return*/public static byte[] encrypt(byte[] content,byte[] key) {try {Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));byte[] result = cipher.doFinal(content);return result;} catch (Exception e) {e.printStackTrace();}return null;}/*** 通过byte[]类型的密钥加密String* @param content* @param key* @return 16进制密文字符串*/public static String encrypt(String content,byte[] key) {try {Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));byte[] data = cipher.doFinal(content.getBytes("UTF-8"));String result = byte2hex(data);return result;} catch (Exception e) {e.printStackTrace();}return null;}/*** 通过String类型的密钥加密String* @param content* @param key* @return 16进制密文字符串*/public static String encrypt(String content,String key) {byte[] data = null;try {data = content.getBytes("UTF-8");} catch (Exception e) {e.printStackTrace();}data = encrypt(data,new SecretKeySpec(hex2byte(key), "AES").getEncoded());String result = byte2hex(data);return result;}/*** 通过byte[]类型的密钥解密byte[]* @param content* @param key* @return*/public static byte[] decrypt(byte[] content,byte[] key) {try {Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));byte[] result = cipher.doFinal(content);return result;} catch (Exception e) {e.printStackTrace();}return null;}/*** 通过String类型的密钥 解密String类型的密文* @param content* @param key* @return*/public static String decrypt(String content, String key) {byte[] data = null;try {data = hex2byte(content);} catch (Exception e) {e.printStackTrace();}data = decrypt(data, hex2byte(key));if (data == null)return null;String result = null;try {result = new String(data, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}/*** 通过byte[]类型的密钥 解密String类型的密文* @param content* @param key* @return*/public static String decrypt(String content,byte[] key) {try {Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.DECRYPT_MODE,new SecretKeySpec(key, "AES"));byte[] data = cipher.doFinal(hex2byte(content));return new String(data, "UTF-8");} catch (Exception e) {e.printStackTrace();}return null;}/*** 字节数组转成16进制字符串* @param b* @return*/public static String byte2hex(byte[] b) { // 一个字节的数,StringBuffer sb = new StringBuffer(b.length * 2);String tmp = "";for (int n = 0; n < b.length; n++) {// 整数转成十六进制表示tmp = (Integer.toHexString(b[n] & 0XFF));if (tmp.length() == 1) {sb.append("0");}sb.append(tmp);}return sb.toString().toUpperCase(); // 转成大写}/*** 将hex字符串转换成字节数组* @param inputString* @return*/private static byte[] hex2byte(String inputString) {if (inputString == null || inputString.length() < 2) {return new byte[0];}inputString = inputString.toLowerCase();int l = inputString.length() / 2;byte[] result = new byte[l];for (int i = 0; i < l; ++i) {String tmp = inputString.substring(2 * i, 2 * i + 2);result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);}return result;}/*** 加密字节数据* @return*/public static String  encryptGame(String src,String keyStr) {try {byte[] content=src.getBytes("UTF-8");byte[] key=keyStr.getBytes("UTF-8");Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));byte[] encrypted = cipher.doFinal(content);String result = Base64.getEncoder().encodeToString(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。return java.net.URLEncoder.encode(result, "UTF-8");} catch (Exception e) {e.printStackTrace();}return null;}/*** 通过byte[]类型的密钥解密byte[]* @return*/public static String decryptGame(String src,String keyStr) {try {byte[] key=keyStr.getBytes("UTF-8");Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));//先用base64解密src = java.net.URLDecoder.decode(src, "UTF-8");byte[] encrypted = Base64.getDecoder().decode(src);String originalString = new String(cipher.doFinal(encrypted), "utf-8");return originalString;} catch (Exception e) {e.printStackTrace();}return null;}
}
/*** 用于java平台的RSA加密解密*/
public class RSA {private static final String ALGORITHM = "RSA";private static final String TRANSFORMATION = "RSA/ECB/PKCS1Padding";private static  BouncyCastleProvider bouncyCastleProvider =null;public static BouncyCastleProvider getInstanceBouncyCastleProvider() {try {if(bouncyCastleProvider != null){}else{Thread.sleep(100);synchronized (BouncyCastleProvider.class) {if(bouncyCastleProvider == null){//二次检查bouncyCastleProvider =new BouncyCastleProvider();}}}} catch (InterruptedException e) {e.printStackTrace();}return bouncyCastleProvider;}/*** 从文件中输入流中加载公钥* * @param in*            公钥输入流* @throws Exception*             加载公钥时产生的异常*/public static RSAPublicKey loadPublicKey(InputStream in) throws Exception {try {BufferedReader br = new BufferedReader(new InputStreamReader(in));String readLine = null;StringBuilder sb = new StringBuilder();while ((readLine = br.readLine()) != null) {if (readLine.charAt(0) == '-') {continue;} else {sb.append(readLine);sb.append('\r');}}return loadPublicKey(sb.toString());} catch (IOException e) {throw new Exception("公钥数据流读取错误");} catch (NullPointerException e) {throw new Exception("公钥输入流为空");}}/*** 从字符串中加载公钥* * @param publicKeyStr*            公钥数据字符串* @return* @throws Exception*             加载公钥时产生的异常*/public static RSAPublicKey loadPublicKey(String publicKeyStr)throws Exception {try {BASE64Decoder base64Decoder = new BASE64Decoder();byte[] buffer = base64Decoder.decodeBuffer(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);return (RSAPublicKey) keyFactory.generatePublic(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("无此算法");} catch (InvalidKeySpecException e) {throw new Exception("公钥非法");} catch (IOException e) {throw new Exception("公钥数据内容读取错误");} catch (NullPointerException e) {throw new Exception("公钥数据为空");}}/*** 从文件中加载私钥* * @param in*            私钥输入流* @return* @throws Exception*/public static RSAPrivateKey loadPrivateKey(InputStream in) throws Exception {try {BufferedReader br = new BufferedReader(new InputStreamReader(in));String readLine = null;StringBuilder sb = new StringBuilder();while ((readLine = br.readLine()) != null) {if (readLine.charAt(0) == '-') {continue;} else {sb.append(readLine);sb.append('\r');}}return loadPrivateKey(sb.toString());} catch (IOException e) {throw new Exception("私钥数据读取错误");} catch (NullPointerException e) {throw new Exception("私钥输入流为空");}}/*** 从字符串中加载私钥* * @desc* @param privateKeyStr*            私钥字符串* @return* @throws Exception*/public static RSAPrivateKey loadPrivateKey(String privateKeyStr)throws Exception {try {BASE64Decoder base64Decoder = new BASE64Decoder();byte[] buffer = base64Decoder.decodeBuffer(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("无此算法");} catch (InvalidKeySpecException e) {throw new Exception("私钥非法");} catch (IOException e) {throw new Exception("私钥数据内容读取错误");} catch (NullPointerException e) {throw new Exception("私钥数据为空");}}/*** 公钥加密* * @param data* @param publicKey* @return* @throws Exception*/public static String encryptByPublicKey(String data, RSAPublicKey publicKey)throws Exception {// 模长int key_len = publicKey.getModulus().bitLength() / 8;// 加密数据长度 <= 模长-11String[] datas = splitString(data, key_len - 11);String mi = "";// 如果明文长度大于模长-11则要分组加密for (String s : datas) {mi += bcd2Str(encryptByPublicKey(s.getBytes(), publicKey));}return mi;}/*** 公钥加密* @desc * @param data* @param publicKey* @return* @throws Exception*/public static byte[] encryptByPublicKey(byte[] data, RSAPublicKey publicKey)throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION,getInstanceBouncyCastleProvider());cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** 私钥加密* @desc * @param data* @param privateKey* @return* @throws Exception*/public static byte[] encryptByPrivateKey(byte[] data,RSAPrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION,getInstanceBouncyCastleProvider());cipher.init(Cipher.ENCRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 私钥加密* @desc * @param data* @param privateKey* @return* @throws Exception*/public static String encryptByPrivateKey(String data,RSAPrivateKey privateKey) throws Exception {// 模长int key_len = privateKey.getModulus().bitLength() / 8;// 加密数据长度 <= 模长-11String[] datas = splitString(data, key_len - 11);String mi = "";// 如果明文长度大于模长-11则要分组加密for (String s : datas) {mi += bcd2Str(encryptByPrivateKey(s.getBytes(), privateKey));}return mi;}/*** 私钥解密* * @param data* @param privateKey* @return* @throws Exception*/public static String decryptByPrivateKey(String data,RSAPrivateKey privateKey) throws Exception {// 模长int key_len = privateKey.getModulus().bitLength() / 8;byte[] bytes = data.getBytes();byte[] bcd = ASCII_To_BCD(bytes, bytes.length);// 如果密文长度大于模长则要分组解密String ming = "";byte[][] arrays = splitArray(bcd, key_len);for (byte[] arr : arrays) {ming += new String(decryptByPrivateKey(arr, privateKey));}return ming;}/*** 私钥解密* @desc* @param data* @param privateKey* @修改人: hcl* @修改原因:BouncyCastleProvider不能被GC回收* @修改时间:2019-10-25* @return* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] data,RSAPrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION,getInstanceBouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}/*** 公钥解密* @desc * @param data* @param publicKey* @return* @throws Exception*/public static String decryptByPublicKey(String data,RSAPublicKey publicKey) throws Exception {// 模长int key_len = publicKey.getModulus().bitLength() / 8;byte[] bytes = data.getBytes();byte[] bcd = ASCII_To_BCD(bytes, bytes.length);// 如果密文长度大于模长则要分组解密String ming = "";byte[][] arrays = splitArray(bcd, key_len);for (byte[] arr : arrays) {ming += new String(decryptByPublicKey(arr, publicKey));}return ming;}/*** 公钥解密* @desc * @param data* @param publicKey* @return* @throws Exception*/public static byte[] decryptByPublicKey(byte[] data,RSAPublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance(TRANSFORMATION,getInstanceBouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}/*** ASCII码转BCD码* */private static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {byte[] bcd = new byte[asc_len / 2];int j = 0;for (int i = 0; i < (asc_len + 1) / 2; i++) {bcd[i] = asc_to_bcd(ascii[j++]);bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));}return bcd;}private static byte asc_to_bcd(byte asc) {byte bcd;if ((asc >= '0') && (asc <= '9'))bcd = (byte) (asc - '0');else if ((asc >= 'A') && (asc <= 'F'))bcd = (byte) (asc - 'A' + 10);else if ((asc >= 'a') && (asc <= 'f'))bcd = (byte) (asc - 'a' + 10);elsebcd = (byte) (asc - 48);return bcd;}/*** BCD转字符串*/private static String bcd2Str(byte[] bytes) {char temp[] = new char[bytes.length * 2], val;for (int i = 0; i < bytes.length; i++) {val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');val = (char) (bytes[i] & 0x0f);temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');}return new String(temp);}/*** 拆分字符串*/private static String[] splitString(String string, int len) {int x = string.length() / len;int y = string.length() % len;int z = 0;if (y != 0) {z = 1;}String[] strings = new String[x + z];String str = "";for (int i = 0; i < x + z; i++) {if (i == x + z - 1 && y != 0) {str = string.substring(i * len, i * len + y);} else {str = string.substring(i * len, i * len + len);}strings[i] = str;}return strings;}/*** 拆分数组*/private static byte[][] splitArray(byte[] data, int len) {int x = data.length / len;int y = data.length % len;int z = 0;if (y != 0) {z = 1;}byte[][] arrays = new byte[x + z][];byte[] arr;for (int i = 0; i < x + z; i++) {arr = new byte[len];if (i == x + z - 1 && y != 0) {System.arraycopy(data, i * len, arr, 0, y);} else {System.arraycopy(data, i * len, arr, 0, len);}arrays[i] = arr;}return arrays;}
}

3.测试

@RestController
@RequestMapping("/sysController")
@Slf4j
public class SysController {/*** 获取RSA加密后的值* 请求参数* {*     "parameters":"0FFD0BEBC6B3EA139EEAE7ED3AD221F34C47E89A561B34A97A8404B1F346B296041CBABE42DCDD369D14AF6FD6732B3F1956EA259B82E0217D7A3195C9226D77C2DC8D7F174568C1CE984B47E585BC217F19CB36A1C55D701AEC033E7A91A38978AF3B03819BE8504BA48585FB55C54BD4644114E18C4BAEB8A7B07D78BA4A41083680F5FDA0DCB7D191539498834DB6870F60F115050D10FEFF2589DC21B10B5E86C70D8B6B5DB6D3C3026DCE48221D5F463119606962D283533C02D457DBBEC997C0F561FE2B931464A2B562CBAB7298151F344D48AFAB5089975808623A6B25545B29DB0EB578E960A2B1FF35F60CC31FE15F5F255FEA646A68C209A98D800559F6496DE109D09B4666BDBC75B76FCAB0484BE561BB0587648B4C848E2D74",*     "key": "1931047F77B1DE73AB11AA5A6BF84D6FFBAEB8086657DEE3D3B2879647E50A5A05FDD2FFD36E560D4C8E35CF7264BD837197006E55F81DCCEAB6CE71C1089616EFFF30BBFC6B204DC35DAF2E341F5595CD9D0125959E2BCA44038C463D1F6C521CDFB4CF51EAA3758C1664D7F57F7DCDF7A6DB975BC4BC5ACCDC54708840EAA5"* }* @param data** @return*/@PostMapping("/getDecryptValue")public String getDecryptValue(@RequestBody String data) {JSONObject jsonObject = JSONUtil.parseObj(data);String key = jsonObject.getStr("key");String parameters = jsonObject.getStr("parameters");if(StringUtils.isBlank(key) || StringUtils.isBlank(parameters)) {return "参数有误!";}return BlendAR.blendDecrypt(new String[] { key, parameters });}/*** RSA 加密* 请求参数:* {"name":"feng"}* @param body* @return** 返回结果集* {*   "parameters": "D91C6A16BD541F90EE6EC94BB24EA902",*  "key": "7A2F8CC697FA365B262A91845A6FCF6A78D2ADEC3422B6A2B03E0B525A323D54B5265A3ADE3A7AE245E00BA3E392397AD3679A64866EB130772772B449B0ABA93D99F4B3E7D4D4F19D0E10232C4CB179D105B2F5E0AFDA471EB4AC436B24F8BE518EA0CEC03BBBF03E0725993FE0A72BF9CA4AD5CA68C67A48B0A66F9276B3FE"* }**/@PostMapping("/setEncryptValue")public String setEncryptValue(String body) {if(StringUtils.isBlank(body)) {return "参数有误!";}String[] data = BlendAR.blendEncrypt(body);Map<String,Object> result = new HashMap<>();result.put("key", data[0]);result.put("parameters", data[1]);return JSONUtil.toJsonStr(result);}
}

RSA非对称加密核心算法相关推荐

  1. JSON 接口如何实现 RSA 非对称加密与签名

    代码地址如下: http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套 ...

  2. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  3. Springboot+RSA非对称加密

    这是百度百科对(对称加密丶非对称加密)的解释: (1)对称加密算法在加密和解密时使用的是同一个秘钥. (2)非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称 ...

  4. 微信小程序RSA非对称加密。

    因公司做的产品为金融项目,所以对数据安全性有很高要求,因为项目中的数据都会通过3DES 对称加密,和RSA非对称加密进行数据传输. 在这里先简单介绍一下什么是对称加密和非对称加密 对称加密:对称加密采 ...

  5. 数据加密 RSA非对称加密篇

    先把代码贴上来,理论后续补充,暂时可先参考数据加密 总篇 package com.jlpay.partner.utils;import android.util.Base64;import java. ...

  6. 加密算法---RSA 非对称加密原理及使用

    加密算法---RSA 非对称加密原理及使用 一 非对称加密原理介绍 二 加密解密测试 2.1 加密解密工具类 2.2 测试 一 非对称加密原理介绍 非对称加密算法中,有两个密钥:公钥和私钥.它们是一对 ...

  7. java RSA非对称加密详解

    简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当 ...

  8. Python代码实现MD5、AES对称加密和RSA非对称加密以及OpenSSl实践

    1.MD5加密算法 1.1 MD5加密的特点 不可逆运算 对不同的数据加密的结果是定长的32位和16位字符(不管文件多大都一样) 对相同的数据加密,得到的结果是一样的(也就是复制). 抗修改性 :信息 ...

  9. 易语言PHP非对称加密,RSA非对称加密通信源码

    RSA非对称加密通信 非对称加密是非常安全的一类加密算法 TXQQ客户Duan的通信也用了椭圆曲线非对称加密(ECC) 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priva ...

最新文章

  1. ROS系统 参数的获取和设置
  2. asp.net mvc 权限过滤和单点登录(禁止重复登录)
  3. 邯郸学院计算机专业是本科还是专科,邯郸学院是大学吗 是本科还是专科
  4. 飞桨 第一课 传统图像识别是怎么做的+Aistudio python数据可视化2020.3.31;2020.4.2补
  5. ireport 找不到子报表:Could not load object from location
  6. 【MFC系列-第13天】Windows系统对话框(对话框记事本逻辑)
  7. GIS实用小技巧(一)-如何将RTK测量数据导入CAD中?
  8. Java基础篇3——流程控制
  9. CCD摄像头视场角计算公式
  10. 【笔记】MySQL的基础学习(二)
  11. java 输出字符集合里的字_Java基础 -- 字符串(格式化输出、正则表达式)(示例代码)...
  12. JavaScript小技巧总结
  13. Hadoop平台简述
  14. 二维数组遍历_布尔值数组的状态压缩
  15. STM32_I2SSAI
  16. 本地打印后台处理程序服务没有运行
  17. AT89C51单片机共阳极数码管动态显示(汇编语言)
  18. C语言之动态内存开辟之malloc
  19. 《腾讯网UED体验设计之旅》
  20. 揭密巴西Banrisul银行网站遭遇5小时劫持的原因

热门文章

  1. 【产品经理】产品体验报告准备
  2. 工作站的数据处理比微型计算机,高效液相色谱分析-数据处理系统
  3. 雷击计算机网络,计算机网络系统防雷设计方案
  4. 友基s400手写板怎么安装_电脑手写板安装步骤 手写板怎么用
  5. ARP病毒防护与查找工具
  6. 2022-11-28-大数据可视化“可视化国产/进口电影票房榜单”分析,特征维度大于50
  7. 每日微软面试题——day 1
  8. EasyExcel导入,如何校验导入的数据(例如:不能为空。)?
  9. Lifekeeper实现DB2主备式群集
  10. 《游戏系统设计七》重现王者荣耀抽奖系统