javascript
javascript rsa java,用javascript与java执行RSA加密与解密
用javascript與java執行
RSA加密與解密
2009-12-12 14:58:30???出處:https://www.yqdown.com
這幾天一直做安全登錄,網上查了好多資料,不盡如意。
具體實現思路如下:
1。服務端生成公鑰與私鑰,保存。
2??蛻舳嗽谡埱蟮降卿涰撁婧?#xff0c;隨機生成一字符串。
3。后此隨機字符串作為密鑰加密密碼,再用從服務端獲取到的公鑰加密生成的隨機字符串。
4。將此兩段密文傳入服務端,服務端用私鑰解出隨機字符串,再用此私鑰解出加密的密文。
這其中有一個關鍵是處理
服務端的公鑰,傳入客戶端,客戶端用此公鑰加密字符串后,后又能在服務端用私鑰解出。
此文即為實現此步而作。
加密算法為RSA:
1。服務端的RSA? java實現
/**???? *???? */??? package com.sunsoft.struts.util;
import java.io.ByteArrayOutputStream;??? import java.io.FileInputStream;??? import java.io.FileOutputStream;??? import java.io.ObjectInputStream;??? import java.io.ObjectOutputStream;??? import java.math.BigInteger;??? 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.SecureRandom;??? import java.security.interfaces.RSAPrivateKey;??? import java.security.interfaces.RSAPublicKey;??? import java.security.spec.InvalidKeySpecException;??? import java.security.spec.RSAPrivateKeySpec;??? import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;
/**???? * RSA 工具類。提供加密,解密,生成密鑰對等要領
。???? * 須要
到http://www.bouncycastle.org下載bcprov-jdk14-123.jar。???? *???? */??? public class RSAUtil {??????? /**???????? * * 生成密鑰對 *???????? *???????? * @return KeyPair *???????? * @throws EncryptException???????? */??????? public static KeyPair generateKeyPair() throws Exception {??????????? try {??????????????? KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????????? final int KEY_SIZE = 1024;// 沒什么好說的了,這個值聯系
到塊加密的大小,可以修改
,但是不要太大,否則效率會低??????????????? keyPairGen.initialize(KEY_SIZE, new SecureRandom());??????????????? KeyPair keyPair = keyPairGen.generateKeyPair();??????????????? saveKeyPair(keyPair);??????????????? return keyPair;??????????? } catch (Exception e) {??????????????? throw new Exception(e.getMessage());??????????? }??????? }
public static KeyPair getKeyPair()throws Exception{??????????? FileInputStream fis = new FileInputStream("C:/RSAKey.txt");???????????? ObjectInputStream oos = new ObjectInputStream(fis);???????????? KeyPair kp= (KeyPair) oos.readObject();???????????? oos.close();???????????? fis.close();???????????? return kp;??????? }
public static void saveKeyPair(KeyPair kp)throws Exception{
FileOutputStream fos = new FileOutputStream("C:/RSAKey.txt");???????????? ObjectOutputStream oos = new ObjectOutputStream(fos);???????????? //生成密鑰???????????? oos.writeObject(kp);???????????? oos.close();???????????? fos.close();??????? }
/**???????? * * 生成公鑰 *???????? *???????? * @param modulus *???????? * @param publicExp
onent *???????? * @return RSAPublicKey *???????? * @throws Exception???????? */??????? public static RSAPublicKey generateRSAPublicKey(byte[] modulus,??????????????? byte[] publicExp
onent) throws Exception {??????????? KeyFactory keyFac = null;??????????? try {??????????????? keyFac = KeyFactory.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????? } catch (NoSuchAlgorithmException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(??????????????????? modulus), new BigInteger(publicExp
onent));??????????? try {??????????????? return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);??????????? } catch (InvalidKeySpecException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }??????? }
/**???????? * * 生成私鑰 *???????? *???????? * @param modulus *???????? * @param privateExp
onent *???????? * @return RSAPrivateKey *???????? * @throws Exception???????? */??????? public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,??????????????? byte[] privateExp
onent) throws Exception {??????????? KeyFactory keyFac = null;??????????? try {??????????????? keyFac = KeyFactory.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????? } catch (NoSuchAlgorithmException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }
RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(??????????????????? modulus), new BigInteger(privateExp
onent));??????????? try {??????????????? return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);??????????? } catch (InvalidKeySpecException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }??????? }
/**???????? * * 加密 *???????? *???????? * @param key???????? *??????????? 加密的密鑰 *???????? * @param data???????? *??????????? 待加密的明文數據 *???????? * @return 加密后的數據 *???????? * @throws Exception???????? */
public static byte[] encrypt(PublicKey pk, byte[] data) throws Exception {??????????? try {??????????????? Cipher cipher = Cipher.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????????? cipher.init(Cipher.ENCRYPT_MODE, pk);??????????????? int blockSize = cipher.getBlockSize();// 獲得加密塊大小,如:加密前數據為128個byte,而key_size=1024??????????????? // 加密塊大小為127??????????????? // byte,加密后為128個byte;因此共有2個加密塊,第一個127??????????????? // byte第二個為1個byte??????????????? int outputSize = cipher.getOutputSize(data.length);// 獲得加密塊加密后塊大小??????????????? int leavedSize = data.length % blockSize;??????????????? int blocksSize = leavedSize != 0 ? data.length / blockSize + 1??????????????????????? : data.length / blockSize;??????????????? byte[] raw = new byte[outputSize * blocksSize];??????????????? int i = 0;??????????????? while (data.length - i * blockSize > 0) {??????????????????? if (data.length - i * blockSize > blockSize)??????????????????????? cipher.doFinal(data, i * blockSize, blockSize, raw, i??????????????????????????????? * outputSize);??????????????????? else??????????????????????? cipher.doFinal(data, i * blockSize, data.length - i??????????????????????????????? * blockSize, raw, i * outputSize);??????????????????? // 這里面doUpdate要領
不能用
,查看源代碼后發覺
每次doUpdate后并沒有什么實際動作除了把byte[]放到??????????????????? // ByteArrayOutputStream中,而最后doFinal的時候才將所有的byte[]執行
加密,可是到了此時加密塊大小很可能已經超出了??????????????????? // OutputSize所以只好用dofinal要領
。
i++;??????????????? }??????????????? return raw;??????????? } catch (Exception e) {??????????????? throw new Exception(e.getMessage());??????????? }??????? }
/**???????? * * 解密 *???????? *???????? * @param key???????? *??????????? 解密的密鑰 *???????? * @param raw???????? *??????????? 已經加密的數據 *???????? * @return 解密后的明文 *???????? * @throws Exception???????? */??????? public static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {??????????? try {??????????????? Cipher cipher = Cipher.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????????? cipher.init(cipher.DECRYPT_MODE, pk);??????????????? int blockSize = cipher.getBlockSize();??????????????? ByteArrayOutputStream bout = new ByteArrayOutputStream(64);??????????????? int j = 0;
while (raw.length - j * blockSize > 0) {??????????????????? bout.write(cipher.doFinal(raw, j * blockSize, blockSize));??????????????????? j++;??????????????? }??????????????? return bout.toByteArray();??????????? } catch (Exception e) {??????????????? throw new Exception(e.getMessage());??????????? }??????? }
/**???????? * * *???????? *???????? * @param args *???????? * @throws Exception???????? */??????? public static void main(String[] args) throws Exception {??????????? RSAPublicKey rsap = (RSAPublicKey) RSAUtil.generateKeyPair().getPublic();??????????? String test = "hello world";??????????? byte[] en_test = encrypt(getKeyPair().getPublic(),test.getBytes());??????????? byte[] de_test = decrypt(getKeyPair().getPrivate(),en_test);??????????? System.out.println(new String(de_test));??????? }??? }
/**???? *???? */??? package com.sunsoft.struts.util;
import java.io.ByteArrayOutputStream;??? import java.io.FileInputStream;??? import java.io.FileOutputStream;??? import java.io.ObjectInputStream;??? import java.io.ObjectOutputStream;??? import java.math.BigInteger;??? 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.SecureRandom;??? import java.security.interfaces.RSAPrivateKey;??? import java.security.interfaces.RSAPublicKey;??? import java.security.spec.InvalidKeySpecException;??? import java.security.spec.RSAPrivateKeySpec;??? import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;
/**???? * RSA 工具類。提供加密,解密,生成密鑰對等要領
。???? * 須要
到http://www.bouncycastle.org下載bcprov-jdk14-123.jar。???? *???? */??? public class RSAUtil {??????? /**???????? * * 生成密鑰對 *???????? *???????? * @return KeyPair *???????? * @throws EncryptException???????? */??????? public static KeyPair generateKeyPair() throws Exception {??????????? try {??????????????? KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????????? final int KEY_SIZE = 1024;// 沒什么好說的了,這個值聯系
到塊加密的大小,可以修改
,但是不要太大,否則效率會低??????????????? keyPairGen.initialize(KEY_SIZE, new SecureRandom());??????????????? KeyPair keyPair = keyPairGen.generateKeyPair();??????????????? saveKeyPair(keyPair);??????????????? return keyPair;??????????? } catch (Exception e) {??????????????? throw new Exception(e.getMessage());??????????? }??????? }
public static KeyPair getKeyPair()throws Exception{??????????? FileInputStream fis = new FileInputStream("C:/RSAKey.txt");???????????? ObjectInputStream oos = new ObjectInputStream(fis);???????????? KeyPair kp= (KeyPair) oos.readObject();???????????? oos.close();???????????? fis.close();???????????? return kp;??????? }
public static void saveKeyPair(KeyPair kp)throws Exception{
FileOutputStream fos = new FileOutputStream("C:/RSAKey.txt");???????????? ObjectOutputStream oos = new ObjectOutputStream(fos);???????????? //生成密鑰???????????? oos.writeObject(kp);???????????? oos.close();???????????? fos.close();??????? }
/**???????? * * 生成公鑰 *???????? *???????? * @param modulus *???????? * @param publicExp
onent *???????? * @return RSAPublicKey *???????? * @throws Exception???????? */??????? public static RSAPublicKey generateRSAPublicKey(byte[] modulus,??????????????? byte[] publicExp
onent) throws Exception {??????????? KeyFactory keyFac = null;??????????? try {??????????????? keyFac = KeyFactory.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????? } catch (NoSuchAlgorithmException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(??????????????????? modulus), new BigInteger(publicExp
onent));??????????? try {??????????????? return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);??????????? } catch (InvalidKeySpecException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }??????? }
/**???????? * * 生成私鑰 *???????? *???????? * @param modulus *???????? * @param privateExp
onent *???????? * @return RSAPrivateKey *???????? * @throws Exception???????? */??????? public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,??????????????? byte[] privateExp
onent) throws Exception {??????????? KeyFactory keyFac = null;??????????? try {??????????????? keyFac = KeyFactory.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????? } catch (NoSuchAlgorithmException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }
RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(??????????????????? modulus), new BigInteger(privateExp
onent));??????????? try {??????????????? return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);??????????? } catch (InvalidKeySpecException ex) {??????????????? throw new Exception(ex.getMessage());??????????? }??????? }
/**???????? * * 加密 *???????? *???????? * @param key???????? *??????????? 加密的密鑰 *???????? * @param data???????? *??????????? 待加密的明文數據 *???????? * @return 加密后的數據 *???????? * @throws Exception???????? */??????? public static byte[] encrypt(PublicKey pk, byte[] data) throws Exception {??????????? try {??????????????? Cipher cipher = Cipher.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????????? cipher.init(Cipher.ENCRYPT_MODE, pk);??????????????? int blockSize = cipher.getBlockSize();// 獲得加密塊大小,如:加密前數據為128個byte,而key_size=1024??????????????? // 加密塊大小為127??????????????? // byte,加密后為128個byte;因此共有2個加密塊,第一個127??????????????? // byte第二個為1個byte??????????????? int outputSize = cipher.getOutputSize(data.length);// 獲得加密塊加密后塊大小??????????????? int leavedSize = data.length % blockSize;??????????????? int blocksSize = leavedSize != 0 ? data.length / blockSize + 1??????????????????????? : data.length / blockSize;??????????????? byte[] raw = new byte[outputSize * blocksSize];??????????????? int i = 0;??????????????? while (data.length - i * blockSize > 0) {??????????????????? if (data.length - i * blockSize > blockSize)??????????????????????? cipher.doFinal(data, i * blockSize, blockSize, raw, i??????????????????????????????? * outputSize);??????????????????? else??????????????????????? cipher.doFinal(data, i * blockSize, data.length - i??????????????????????????????? * blockSize, raw, i * outputSize);
// 這里面doUpdate要領
不能用
,查看源代碼后發覺
每次doUpdate后并沒有什么實際動作除了把byte[]放到??????????????????? // ByteArrayOutputStream中,而最后doFinal的時候才將所有的byte[]執行
加密,可是到了此時加密塊大小很可能已經超出了??????????????????? // OutputSize所以只好用dofinal要領
。
i++;??????????????? }??????????????? return raw;??????????? } catch (Exception e) {??????????????? throw new Exception(e.getMessage());??????????? }??????? }
/**???????? * * 解密 *???????? *???????? * @param key???????? *??????????? 解密的密鑰 *???????? * @param raw???????? *??????????? 已經加密的數據 *???????? * @return 解密后的明文 *???????? * @throws Exception???????? */??????? public static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {??????????? try {??????????????? Cipher cipher = Cipher.getInstance("RSA",??????????????????????? new org.bouncycastle.jce.provider.BouncyCastleProvider());??????????????? cipher.init(cipher.DECRYPT_MODE, pk);??????????????? int blockSize = cipher.getBlockSize();??????????????? ByteArrayOutputStream bout = new ByteArrayOutputStream(64);??????????????? int j = 0;
while (raw.length - j * blockSize > 0) {??????????????????? bout.write(cipher.doFinal(raw, j * blockSize, blockSize));??????????????????? j++;??????????????? }??????????????? return bout.toByteArray();??????????? } catch (Exception e) {??????????????? throw new Exception(e.getMessage());??????????? }??????? }
/**???????? * * *???????? *???????? * @param args *???????? * @throws Exception???????? */??????? public static void main(String[] args) throws Exception {??????????? RSAPublicKey rsap = (RSAPublicKey) RSAUtil.generateKeyPair().getPublic();??????????? String test = "hello world";??????????? byte[] en_test = encrypt(getKeyPair().getPublic(),test.getBytes());??????????? byte[] de_test = decrypt(getKeyPair().getPrivate(),en_test);??????????? system.out.println(new String(de_test));??????? }??? }
2.測試頁面:
IndexAction.java
/*???? * Generated by MyEclipse Struts???? * Template path: templates/java/JavaClass.vtl???? */??? package com.sunsoft.struts.action;
import java.security.interfaces.RSAPrivateKey;??? import java.security.interfaces.RSAPublicKey;
import javax.servlet.http.HttpServletRequest;??? import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;??? import org.apache.struts.action.ActionForm;??? import org.apache.struts.action.ActionForward;??? import org.apache.struts.action.ActionMapping;
import com.sunsoft.struts.util.RSAUtil;
/**???? * MyEclipse Struts???? * Creation date: 06-28-2008???? *???? * XDoclet definition:???? * @struts.action validate="true"???? */??? public class IndexAction extends Action {??????? /*???????? * Generated Methods???????? */
/**???????? * Method execute???????? * @param mapping???????? * @param form???????? * @param request???????? * @param response???????? * @return ActionForward???????? */??????? public ActionForward execute(ActionMapping mapping, ActionForm form,??????????????? HttpServletRequest request, HttpServletResponse response)throws Exception {
RSAPublicKey rsap = (RSAPublicKey) RSAUtil.getKeyPair().getPublic();??????????? String module = rsap.getModulus().toString(16);??????????? String empoent = rsap.getPublicExp
onent().toString(16);??????????? System.out.println("module");??????????? System.out.println(module);??????????? System.out.println("empoent");??????????? System.out.println(empoent);??????????? request.setAttribute("m", module);??????????? request.setAttribute("e", empoent);??????????? return mapping.findForward("login");??????? }??? }
/*???? * Generated by MyEclipse Struts???? * Template path: templates/java/JavaClass.vtl???? */??? package com.sunsoft.struts.action;
import java.security.interfaces.RSAPrivateKey;??? import java.security.interfaces.RSAPublicKey;
import javax.servlet.http.HttpServletRequest;??? import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;??? import org.apache.struts.action.ActionForm;??? import org.apache.struts.action.ActionForward;??? import org.apache.struts.action.ActionMapping;
import com.sunsoft.struts.util.RSAUtil;
/**???? * MyEclipse Struts???? * Creation date: 06-28-2008???? *???? * XDoclet definition:???? * @struts.action validate="true"???? */??? public class IndexAction extends Action {??????? /*???????? * Generated Methods???????? */
/**???????? * Method execute???????? * @param mapping???????? * @param form???????? * @param request???????? * @param response???????? * @return ActionForward???????? */??????? public ActionForward execute(ActionMapping mapping, ActionForm form,??????????????? HttpServletRequest request, HttpServletResponse response)throws Exception {
RSAPublicKey rsap = (RSAPublicKey) RSAUtil.getKeyPair().getPublic();??????????? String module = rsap.getModulus().toString(16);??????????? String empoent = rsap.getPublicExp
onent().toString(16);??????????? system.out.println("module");??????????? system.out.println(module);??????????? system.out.println("empoent");??????????? system.out.println(empoent);??????????? request.setAttribute("m", module);??????????? request.setAttribute("e", empoent);??????????? return mapping.findForward("login");??????? }??? }
通過此action進入登錄頁面,并傳入公鑰的 Modulus 與PublicExp
onent的hex編碼形式。
3。登錄頁面 login.jsp
login??????? ??????? ??????? ??????? ??????? ??? ??? ??? ???
}
?????
?????????| Login: | |
| Password: | |
??????? ??????? ??????? ??????? ??????? ??? ??? ??? ???
}
?????
?????????| Login: | |
| Password: | |
/*???? * Generated by MyEclipse Struts???? * Template path: templates/java/JavaClass.vtl???? */??? package com.sunsoft.struts.action;
import java.math.BigInteger;
import javax.servlet.http.HttpServletRequest;??? import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;??? import org.apache.struts.action.ActionForm;??? import org.apache.struts.action.ActionForward;??? import org.apache.struts.action.ActionMapping;
import com.sunsoft.struts.util.RSAUtil;
/**???? * MyEclipse Struts???? * Creation date: 06-28-2008???? *???? * XDoclet definition:???? * @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true"???? * @struts.action-forward name="error" path="/error.jsp"???? * @struts.action-forward name="success" path="/success.jsp"???? */??? public class LoginAction extends Action {??????? /*???????? * Generated Methods???????? */
/**???????? * Method execute???????? * @param mapping???????? * @param form???????? * @param request???????? * @param response???????? * @return ActionForward???????? */??????? public ActionForward execute(ActionMapping mapping, ActionForm form,??????????????? HttpServletRequest request, HttpServletResponse response) throws Exception{??????????? //LoginForm loginForm = (LoginForm) form;??????????? String result = request.getParameter("result");??????????? System.out.println("原文加密后為:");??????????? System.out.println(result);??????????? byte[] en_result = new BigInteger(result, 16).toByteArray();??????????? System.out.println("轉成byte[]"+new String(en_result));??????????? byte[] de_result = RSAUtil.decrypt(RSAUtil.getKeyPair().getPrivate(),en_result);??????????? System.out.println("還原密文:");
System.out.println(new String(de_result));??????????? StringBuffer sb = new StringBuffer();??????????? sb.append(new String(de_result));??????????? System.out.println(sb.reverse().toString());??????????? return mapping.findForward("success");??????? }??? }
/*???? * Generated by MyEclipse Struts???? * Template path: templates/java/JavaClass.vtl???? */??? package com.sunsoft.struts.action;
import java.math.BigInteger;
import javax.servlet.http.HttpServletRequest;??? import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;??? import org.apache.struts.action.ActionForm;??? import org.apache.struts.action.ActionForward;??? import org.apache.struts.action.ActionMapping;
import com.sunsoft.struts.util.RSAUtil;
/**???? * MyEclipse Struts???? * Creation date: 06-28-2008???? *???? * XDoclet definition:???? * @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true"???? * @struts.action-forward name="error" path="/error.jsp"???? * @struts.action-forward name="success" path="/success.jsp"???? */??? public class LoginAction extends Action {??????? /*???????? * Generated Methods???????? */
/**???????? * Method execute???????? * @param mapping???????? * @param form???????? * @param request???????? * @param response???????? * @return ActionForward???????? */??????? public ActionForward execute(ActionMapping mapping, ActionForm form,??????????????? HttpServletRequest request, HttpServletResponse response) throws Exception{??????????? //LoginForm loginForm = (LoginForm) form;??????????? String result = request.getParameter("result");??????????? system.out.println("原文加密后為:");??????????? system.out.println(result);??????????? byte[] en_result = new BigInteger(result, 16).toByteArray();??????????? system.out.println("轉成byte[]"+new String(en_result));??????????? byte[] de_result = RSAUtil.decrypt(RSAUtil.getKeyPair().getPrivate(),en_result);??????????? system.out.println("還原密文:");
system.out.println(new String(de_result));??????????? StringBuffer sb = new StringBuffer();??????????? sb.append(new String(de_result));??????????? system.out.println(sb.reverse().toString());??????????? return mapping.findForward("success");??????? }??? }
分享到
總結
以上是生活随笔為你收集整理的javascript rsa java,用javascript与java执行RSA加密与解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 按钮键盘,java中关于键盘代
- 下一篇: php删除禁用函数,百度云平台封禁的PH