用javascript与java执行

RSA加密与解密

2009-12-12 14:58:30   出处:https://www.yqdown.com

这几天一直做安全登录,网上查了好多资料,不尽如意。

具体实现思路如下:

1。服务端生成公钥与私钥,保存。

2。客户端在请求到登录页面后,随机生成一字符串。

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

}

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加密与解密相关推荐

  1. java对excel加密_Java 加密、解密Excel文档

    一.概述 本文介绍通过Java程序来实现Excel文档加密以及解密的方法,包括对Excel工作簿加密.解密,对指定工作表加密.解密.程序中使用了免费版Java Excel类库(Free Spire.X ...

  2. java pkcs1转pkcs8_.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接...

    众所周知在.NET下的RSA类所生成的密钥为Xml格式,而其他语言比如java一般使用pkcs8格式的密钥,JavaScript一般使用pkcs1格式.我们在开发过程中很可能遇到需要与其他语言开发的a ...

  3. Java动态性(3) - 脚本引擎执行javascript代码

    1.脚本引擎执行JavaScript代码 脚本引擎介绍 使得Java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在Java平台上调用各种脚本语言的目的 Java脚本API是连通Java平 ...

  4. 【java神操作】java竟然还可以能执行Javascript代码!!

    引入:闲着没事想研究下学校查成绩的接口,然后自己写程序查.但是查成绩首先必须登录,所以必须先研究学校网站的登录接口,抓包后发现传到后台的学号密码是经过加密的,研究其加密方法成为必经之路 发现学校网站改 ...

  5. 网页开发需要先学java吗_先学java还是javascript?

    Javascript和java是两回事,并没有什么必然的联系.java是在服务器上运行的程序,Javascript是浏览器端执行的脚本语言! 想搞前端就学JavaScript,想搞后端就学Java.也 ...

  6. java js 转换_[Java教程]javascript 类型转换。

    [Java教程]javascript 类型转换. 0 2016-10-11 18:00:06 目录: 1 : 伪对象 2 : 转换为字符串 3 : 数字转字符串 4 : 转换为数字 5 : 转换为Bo ...

  7. 辨析Java与Javascript

    首先,它们是两个公司开发的不同的两个产品,Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是Netscape公司的产品,其目的是为 ...

  8. 【扫盲帖】Java、JavaScript、JSP、JScript 的区别与联系

    [转自]http://developer.51cto.com/art/200907/140294.htm ==>JavaScript与Java的联系和区别 JavaScript与Java的语法比 ...

  9. Nashorn——在JDK 8中融合Java与JavaScript之力--转

    原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性 ...

最新文章

  1. java事件的接收_spring发布和接收定制的事件(spring事件传播)
  2. 单元测试 代码里面都绝对路径怎么处理_原创 | 编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP...
  3. php界面设置编码格式,php设置编码格式的方法
  4. 关于ECMAScript6 的学习01-ES6 的六种变量声明方式===关于常量const
  5. Spring学习总结(29)——Spring异步处理@Async的使用以及原理、源码分析(@EnableAsync)
  6. mysql中如何将几个没有关系的结果集放在一起
  7. 智慧能源管理控制系统项目软件供应商
  8. XNA中的中文输入(一)
  9. 虚拟化云计算-centos7上使用virt-manager安装虚拟机
  10. Vuforia3D模型上传
  11. 开源web管理系统mysql_10个基于Web的开源项目管理系统
  12. 自制的基Ogre的场景编辑器—OgreSE
  13. 计算机表格做八折怎么辛,五笔字根表口诀.doc
  14. 【转载】django-数据库[ 配置 ]
  15. Codeforces Round #496 (Div. 3) E2 - Median on Segments (General Case Edition)(思维+用bit 位求前缀合)
  16. unity实现去中心化社交软件
  17. Excel-给条形统计图加走线趋势
  18. SAP 小币种金额的转换函数和处理
  19. SyntaxError: Missing parentheses in call to ‘print‘. Did you mean print(e)?
  20. 银行从业资格考试通过后如何申请证书

热门文章

  1. 安装OpenResty开发环境
  2. android 应用内部组织关系
  3. 解决Android中无法搜索联系人的问题
  4. java从静态代理到动态代理的理解
  5. 美国版“健康码”遭遇尴尬:隐私保护最大化 疫情追踪基本无效
  6. 北京大学AI写作机器人来了,会替代记者?
  7. 深度学习之利用TensorFlow实现简单的全连接层网络(MNIST数据集)
  8. C++和服务器交互的几个文件代码
  9. ssh 连接_怎样解决Linux环境下远程连接ssh速度慢的问题
  10. 小米手环4怎么使用_小米手环4/5 NFC添加加密门禁