首页 > 其他分享 >为 jsencrypt 增加私钥加密公钥解密的方法逻辑

为 jsencrypt 增加私钥加密公钥解密的方法逻辑

时间:2024-05-09 19:35:38浏览次数:14  
标签:公钥 加密 0x00 解密 RSA 私钥 jsencrypt

首先声明,使用 RSA 非对称加密,正常的使用情景是公钥加密、私钥解密。

因为正常使用情景下,公钥是公开的,如果将私钥加密的数据发出去,使用公钥解密,其实理论上并没有起到加密的作用。

私钥加密、公钥解密的使用场景是在于防篡改,确定私钥发来的数据是正确的。

其实某种程度来说,确实就没必要再实现私钥加密,公钥解密的逻辑了。

不过出于强迫症的角度,理论上私钥是可以用于加密的,公钥也可以用于解密,那为什么不实现一下呢。。。

在 .NET 中,使用 BouncyCastle 是可以轻易实现的,但在 JavaScript 中,几乎所有 RSA 的算法库都没有进行支持。

好在有这种奇奇怪怪的需求的人们不少,jsencrypt 也算是使用比较广泛的一个 JavaScript 中的 RSA 算法库了,

总结了一下网上大家的思路,基于 jsencrypt 已有的公钥加密、私钥解密逻辑,修改了一套私钥加密、公钥解密的逻辑出来。

这里面比较核心的点,是 PKCS #1: RSA Encryption Version 1.5 的数据块组成

本身在 jsencrypt 中,私钥公钥的算法都是通用的,只是基于 pkcs 的封装有一些差异,导致无法使用私钥加密、公钥解密。

在此记录一下,

在需要加密时,在进行 RSA 运算前,需要先将源数据 D 封装为 Encryption block(EB)。

其中 PKCS #1: RSA Encryption Version 1.5 的数据块组成如下:

EB = 0x00 + BT + PS + 0x00 + D

说明:EB 为转化后的字节数组(一般以 16 进制表示),EB字节数组长度 = 密钥长度 / 8

0x00:第一位固定为 0x00
BT:公钥加密:0x02,私钥加密:0x00 或 0x01

PS:填充位,除固定位和数据位外,对 EB 的其余字节位进行填充,一般至少保留 8 位。
BT = 0x00 时全部填充 0x00(此种情景下,数据部分的首位字节必须非零,否则将无法准确的识别数据区)
BT = 0x01 时全部填充 0xFF
BT = 0x02 时随机产生数字填充(不允许填充 0x00)

0x00:源数据 D 的前一个字节,固定为 0x00,用于分隔填充位与数据区
D:源数据,填充在 EB 最后,因以上组成部分,源数据字节数组最大长度 = 密钥长度 / 8 - (1 + 1 + 8 + 1),即:EB长度-11

一般 RSA 密钥长度为 1024 位,则:
EB字节数组长度 = 1024 / 8 = 128
源数据字节数组最大长度 = 128 - 11 = 117

同理,解密就是在 RSA 运算后,按以上结构将数据再进行取出即可。

参考文章:

https://www.cnblogs.com/wsss/p/11516318.html

https://datatracker.ietf.org/doc/html/rfc2313#section-8.1

https://github.com/lwenhaoCN/RSA

https://blog.csdn.net/junxuezheng/article/details/109824552

因为看 jsencrypt 项目已经很久不怎么更新了,感觉也不太会有大更新了,直接 fork 了一个进行修改,后续可以直接用了。

修改好的 jsencrypt 项目地址:https://github.com/xwgli/jsencrypt

标签:公钥,加密,0x00,解密,RSA,私钥,jsencrypt
From: https://www.cnblogs.com/xwgli/p/18182948

相关文章

  • 公钥加密 openssl_public_encrypt(): key parameter is not a valid public key
    公钥加密处理报错, openssl_public_encrypt():keyparameterisnotavalidpublickey1.开启open_ssl扩展2.转化再加密下载的公钥形式类似'-----BEGINPUBLICKEY-----\nMIGTDVGHWDFNADCBiQKBgQ99XZ6WiHxh94IAKTgSOEev\n6tASj3XKVnssChGIZaSvdRXiJshGaR1LNeDbWSDFWE8OjA......
  • [网络/HTTPS/Java] PKI公钥基础设施体系:基础概念篇
    0序看过上一篇文章、且有点懵的朋友,可以参看本篇————针对PKI体系的核心概念进行解释。1PKI体系(公开密钥基础设施体系)1.1PKI体系是什么?PKI是PublicKeyInfrastructure的缩写,中文叫做公开密钥基础设施,也就是利用公开密钥机制建立起来的基础设施。PKI的主要......
  • 公钥私钥和模数指数相互转换
    pem格式公钥私钥读取解析公钥私钥pem格式加解密示例根据私钥pem生成模数和指数NED生成模数和指数NED的公钥私钥NED导出pem格式#include<SylixOS.h>#include<stdio.h>#include<crypto.h>#include<mbedtls/ssl.h>#include<mbedtls/platform.h>......
  • web渗透-SSH私钥泄露
    发现主机netdiscover-r192.168.164.0扫描端口看到开放80和31337端口都为http服务 浏览器访问测试查看80端口和31337端口网页和源代码并无发现有用信息 目录扫描 扫描出80端口并无有用信息扫描31337端口发现敏感文件robots.txt和目录.ssh 访问敏感文件和目......
  • App备案-iOS证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
    IOS平台App备案,apple不提供云管理式证书的下载,也就无法获取公钥及证书SHA-1指纹。  已经上架的应用不想重新打包发布的话。可以通过以下方法获取证书Certificate:访问AppleDeveloper(简体中文),使用App对应的iOS开发者账号登录。 苹果开发者账号地址 https://developer.......
  • SecureCRT通过私钥连接跳板机,再连接到目标服务器
    文章目录1.配置第一个session(跳板机)2.设置本地端口3.设置全局firewall4.配置第二个session(目标服务器)服务器那边给了一个私钥,现在需要通过私钥连接跳板机,再连接到目标服务器上......
  • scp与pscp公私钥条件下的文件传输
    一、常见用法scp是SecureCopyProtocol(安全复制协议)的缩写,可以在本地系统和远程系统之间复制文件,同时提供了数据加密和压缩功能,以确保数据在传输过程中的安全性和完整性。pscp是putty系列的工具,可以用在window平台作为scp的替代。远程>>本地[email protected]:/opt/s......
  • SSH中私钥和公钥的使用
    在SSH(SecureShell)中,密钥对用于加密和身份验证,保证了远程会话的安全。一个密钥对包括两部分:公钥和私钥。它们有不同的作用和特性:私钥私钥是一个用户保密的密钥,它绝不能被泄露或分享给其他人。保存在用户的本地计算机上,用于SSH进行安全的认证。通常由SSH客户端软件生成并......
  • iOS、Android获取apk公钥MD5信息
    背景国家工信部规定,所有国内在线或即将上线的APP做备案,否则无法通过域名访问。其中iOS和Android备案所需的APP相关信息我们不能直接明文获取,有公钥,MD5,包名,APP名,接口服务的域名等对于iOS端,如果是开发者,直接在苹果的证书管理网站上下载证书到本地打开,即可获得。参考对于Androi......
  • VScode 配置私钥免密登录
    VScode配置私钥免密登录配置公钥私钥进行免密登录在前文已经提及。在完成上述配置后,我们希望在VScode中配置,毕竟主要的开发环境还是在VScode上且连接到远程服务器会经常遇到网络不稳定需要重新输入密码登录的情况,所以更加凸显了配置私钥的必要性。前提条件本地主机中已有配置......