关于rsa:前端二次非对称RSA加密密文太长的问题

文章不易,请关注公众号 毛毛虫的小小蜡笔,多多反对,谢谢。 有任何问题都能够留言征询。 问题两个平台我的项目中,各自的前后端的明码传输,都用了非对称RSA加密。 流程是这样的:平台A的前端,须要把加密后的密文传给平台B的前端,而后平台B的前端都会对明码进行加密,而后再传输给平台B的后端。平台B的后端解密后,再传输给平台A的后端。 导致的问题:因为平台B的前端,拿到的明码是曾经在平台A加密过的密文,此时再次加密,就会报错。 如下截图所示: 前端用的是jsencrypt库,报错的意思是文本太长了。 详情 请查看:毛毛虫的小小蜡笔

August 22, 2022 · 1 min · jiezi

关于rsa:在golang与javascript中使用RSA

需要首先在golang中生成keypair,javascript向golang发送数据前,先申请publickey API获取publickey,而后基于publickey加密数据,最初将被加密的数据发送给golang。 实现一、golang生成keypairvar ( privateKey *rsa.PrivateKey publicKey *rsa.PublicKey publicKeyString string)if pri, err := rsa.GenerateKey(rand.Reader, 32); err != nil { panic(err)} else { privateKey = pri publicKey = &pri.PublicKey}// 将publicKey转换为PKIX, ASN.1 DER格局if derPkix, err := x509.MarshalPKIXPublicKey(publicKey); err != nil { return err} else { // 设置PEM编码构造 block := pem.Block{ Type: "RSA PUBLIC KEY", Bytes: derPkix, } // 将publicKey以字符串模式返回给javascript publicKeyString = string(pem.EncodeToMemory(&block))}二、javascript应用publickey加密数据装置jsencrypt npm install jsencrypt获取publickey const [pk, setPK] = useState('')useEffect(() => { fetch(`${url}`, {method: 'GET'}) .then(r => r.json()) .then(d => { if (d.hasOwnProperty('public_key')) setPK(d.public_key) else alert('API返回值短少必要字段!') }) .catch(e => {alert(e)})}, [])加密用户数据 ...

July 27, 2022 · 1 min · jiezi

关于rsa:两端异构情况下nodejs端RSA加密解密要点

已有服务器应用的是ASP.net进行RSA加密,新服务器应用koa2,加密后的后果应用nodejs自带的crypto和node-rsa均无奈解密,起因未明。试用多个组件后,发现node-jsencrypt的加密解密后果能够通用。故特意记录。 简略的解密流程: const JSEncrypt = require("node-jsencrypt");const PUBLICKEY = `-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCFSws2t8RQ8IlrXQmkE7lOYQ5hXya+HdXrBDh5zGv3+suPEj8K+sLuPfsGCRC6VbyKkzwGECNrzwOPWTx7szHMp4OuIRCe8wEyV2TAri7eRukgelXVG4Fh4F1jS14jdWeTfRXFxygkkGTyCvKbWzm9Hp93fNKDHuB+bTvRS9YMuwIDAQAB-----END PUBLIC KEY-----`;//公钥 const rsaEncrypt = `密文`; let jsencrypt = new JSEncrypt(); jsencrypt.setPrivateKey(PRIVATEKEY); let decrypt = jsencrypt.decrypt(rsaEncrypt)字符串长度超过117时,该组件就不能间接解密,如果超长字符串加密,须要进行宰割解决长字符串的加密解决: //宰割 if (querystr.length > 117) { let cnt = Number.parseInt(querystr.length / 117) + 1; ori_slice.push(querystr.slice(0, len_max)) for (let i = 1; i < cnt; i++) { const _slice = querystr.slice(len_max * i).trim(); if (_slice.length > 0) { ori_slice.push(querystr.slice(len_max * i)); } } }//加密并组合let encrypt_list = ori_slice.map(i => { let jsencrypt = new JSEncrypt(); jsencrypt.setPublicKey(PUBLICKEY); let encrypt = jsencrypt.encrypt(i); return encrypt; }); let encrypt_query = encrypt_list.join('::');//以::双冒号划分解密时,分段解密并拼接即可 ...

July 15, 2022 · 1 min · jiezi

关于rsa:编程中常用的加密算法

前言编程中常见的加密算法有以下几种,它们在不同场景中别离有利用。除信息摘要算法外,其它加密形式都会须要密钥。 信息摘要算法对称加密算法非对称加密算法密钥密钥(key,又常称金钥)是指某个用来实现加密、解密、完整性验证等密码学利用的机密信息。 密钥分类加解密中的密钥:对称加密中共享雷同的密钥,非对称加密中分公钥和私钥,公钥加密私钥解密。音讯认证码和数字签名中的密钥:在音讯认证码中,音讯发送方和接管方应用共享密钥进行认证。在数字签名中,签名应用私钥,而验证应用公钥。会话密钥和主密钥:每次通信只应用一次的密钥称为会话密钥(session key)。绝对于会话密钥,重复使用的密钥称为主密钥(master key)。密钥和明码明码个别是由用户生成,具备可读性,能够记忆和存储,罕用于软件治理,而密钥是供实现加密算法的软件应用,不须要具备可读性(不过在编程中为了不便浏览都进行Base64)。咱们也能够通过明码来生成密钥。 密钥治理生成密钥:能够用随机数生成密钥,也能够用口令生成密钥。配送密钥:可采纳当时共享密钥、应用密钥调配核心、应用公钥明码、应用Diffie-Hellman密钥替换。更新密钥保留密钥作废密钥密钥生成jdk 中 jce (Java Cryptography Extension) 蕴含了加密相干的所有API。 生成对称加密算法的密钥 public static SecretKey generateKey(int keySize) { KeyGenerator keyGenerator; try { keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(keySize); return keyGenerator.generateKey(); } catch (NoSuchAlgorithmException e) { // ignore return null; } }生成对称非对称加密算法的密钥 /** * 生成非对称密钥对 * * @param keySize 密钥大小 * @param random 指定随机起源,默认应用 JCAUtil.getSecureRandom() * @return 非对称密钥对 * @throws NoSuchAlgorithmException NoSuchAlgorithm */ public static PPKeys genKeysRSA(int keySize, SecureRandom random) throws NoSuchAlgorithmException { KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); if (null != random) { generator.initialize(keySize, random); } else { generator.initialize(keySize); } KeyPair pair = generator.generateKeyPair(); PPKeys keys = new PPKeys(); PublicKey publicKey = pair.getPublic(); PrivateKey privateKey = pair.getPrivate(); keys.setPublicKey(Base64.getEncoder().encodeToString(publicKey.getEncoded())); keys.setPrivateKey(Base64.getEncoder().encodeToString(privateKey.getEncoded())); return keys; }密钥协商(Diffie-Hellman) ...

March 18, 2022 · 4 min · jiezi

关于rsa:非对称加密和对称加密使用场景

在理论利用的时候,非对称加密总是和对称加密一起应用。假如小明须要给小红须要传输加密文件,他俩首先替换了各自的公钥,而后: 1.小明生成一个随机的AES口令,而后用小红的公钥通过RSA加密这个口令,并发给小红;2.小红用本人的RSA私钥解密失去AES口令;3.单方应用这个共享的AES口令用AES加密通信。可见非对称加密实际上利用在第一步,即加密“AES口令”。这也是咱们在浏览器中罕用的HTTPS协定的做法,即浏览器和服务器先通过RSA替换AES口令,接下来单方通信实际上采纳的是速度较快的AES对称加密,而不是迟缓的RSA非对称加密。

December 8, 2021 · 1 min · jiezi

关于rsa:非对称加密之RSA详细分析

RSA原理和数学根底不再赘述,网上材料比拟多,本文重点剖析,RSA信息如何在证书等相干畛域的利用。 RSA密钥生成过程大略是这样的, p、q: 随机找两个大素数p、q,n:把它们的乘积后果记为n(n):计算n的欧拉函数(n) = (p-1)(q-1)e:随机抉择一个整数e,条件是1< e < (n),且e与(n) 互质。(理论利用中,经常抉择65537。)d:d满足 ed ≡ 1 (mod (n))将n和e封装成公钥,n和d封装成私钥。证书信息以思否网站的证书为例,咱们看到应用的非对称加密是RSA 公钥信息RSA(2048Bits)阐明,公钥长度是2048个比特,也就是n这个十进制大整数转换为二进制的bit个数。依据RSA密钥生成过程,公钥是又n和e组成,e个别用65537。那么,在证书的公钥信息里,n和e在哪里?然而数上面的30 82 01 0a...的所有字节,增强远超过2048bit。 到这,不得不提ASN.1编码,人们为了不便存储、传输、替换信息而制订的编码方式,这种编码方式是独立于任何零碎和设施的,以达到跨零碎,跨畛域传输通用性。咱们晓得,RSA生成公钥,就是n和e,n和e,通过ASN.1的编码标准进行编码,这样,任何人,任何设施,只有依照标准去解码,必定可能获取n和e,其实就是ASN.1编码对立通信语言。好了,到这里,咱们晓得,证书的公钥信息是ASN.1编码的,那就依照编码标准,解析出n和e即可,其实很简略,n和e就嵌在公钥信息里,间接提取就行。 30 82 01 22 30 0d 06 09 2a 86 48 86 f7 0d 01 0101 05 00 03 82 01 0f 00 30 82 01 0a 02 82 01 0100 ba 3c 0b 9f a4 6a 8c 70 37 c2 eb 69 b7 07 f6c0 b9 3d 83 28 8b a2 db e9 96 88 23 fc ca 43 1c2b 68 1c 63 12 67 94 0e 20 61 8f b0 28 96 7a e542 e6 61 e2 35 32 5b b4 0d 7d 6b 65 5b c4 7d 3e91 4a c8 af 81 fb c7 aa 02 dd 69 e7 5b 31 68 79ff 41 65 5e 32 e3 f1 6a 81 20 c9 c2 ff 4b e1 ab14 a2 ce b0 39 15 86 35 7a d9 25 b1 5a 32 a4 cc3a fe 35 7c 05 5e 41 9a 9a 88 6f f9 5f 28 18 7b6c 3d fc b1 04 7a 29 4f 34 00 01 b0 97 f9 4e bce8 ad e7 5d 98 8e ed 3b 3b d0 01 87 8b 63 4e c38d e5 1f bf 80 39 e5 80 c8 06 4f 35 40 c9 de 3b42 50 2c 73 fe 51 8a 8a ea dd 38 77 8b 6f 34 9941 bb f1 3f 9e 09 29 53 ff ec f6 92 04 bf 77 f7b6 48 11 05 39 22 86 1b 72 fe 4d 94 a3 7d 48 c81c f9 eb 93 87 06 e0 d5 69 61 e2 9e 2c 38 d8 8d63 38 ab 32 7d 7c a5 50 bf 8b 83 0c 5e 7e 76 ca65 02 03 01 00 01 ...

October 7, 2021 · 2 min · jiezi