Bouncy Castle

.NET Core加解密实战系列之——消息摘要与数字签名算法

…衆ロ難τιáo~ 提交于 2020-08-11 16:50:12
目录 简介 功能依赖 消息摘要算法 MD算法 家族发展史 应用场景 代码实现 MD5 示例代码 SHA算法 应用场景 代码实现 SHA1 SHA256 示例代码 MAC算法 HMAC算法的典型应用 HMAC算法的安全性 HMAC组合散列函数 代码实现 HMAC-MD5 HMAC-SHA1 HMAC-SHA256 示例代码 数字签名算法 Rivest-Shamir Adelman算法( RSA) 代码实现 SHA1WithRSA SHA256WithRSA 示例代码 数字签名算法(DSA) 代码实现 SHA1/DSA SHA256/DSA 示例代码 椭圆曲线数字签名算法(ECDSA) 代码实现 SHA1/ECDSA SHA256/ECDSA 示例代码 下期预告 简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux、Windows) 语言互通问题(如C#、Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料版本不一、或不全面 .NET官方库密码算法提供不全面,很难针对其他语言(Java)进行适配 本系列文章主要介绍如何在 .NET Core 中使用非对称加密算法、编码算法、消息摘要算法、签名算法、对称加密算法、国密算法等一系列算法,如有错误之处,还请大家批评指正。 本系列文章旨在引导大家能快速、轻松的了解接入加解密

JS实现国密算法SM2加密,后端Java解密

蓝咒 提交于 2020-08-10 02:26:18
项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是使用非对称加密,后端生成密钥对,将公钥交给前端,前端用公钥加密数据,后端用私钥对数据解密。项目的复杂度在于国密的非对称加密算法SM2的Java及JS实现。 Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:https://github.com/Saberization/SM2,感谢作者。分别整理下前端后端的实现过程: 后端首先引入bouncycastle,Maven配置如下: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.65</version> </dependency>    后端Java代码如下: //生成密钥对 X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG()

RSA遇上中国剩余定理

南笙酒味 提交于 2020-08-05 04:41:16
1.Introduction 最近读论文刚好用到了这个,之前只是有耳闻,没有仔细研究过,这里就好好捋一下,会逐步完善 不过貌似CRT(中国剩余定理)的实现更容易被攻击 2. RSA: Overview rsa算法描述如下: 选择两个大素数 \(p、q\) ,计算 \(N = p*q\) (最好保证N在2048bit以上,最新的研究工作已经可以成功分解762bit的N) 计算 \(\phi(N)=(p-1)*(q-1)\) 选择一个 \(e\) 使得 \(gcd(e, \phi(n)) == 1\) ,e由于是作加密使用,故推荐使用小值,推荐使用3、65537( \(2^{16}+1\) ),65537只有两个1bit,所以在幂运算(参加我的另一篇博客: 快速指数算法 )时只需要两次额外的乘法运算;此外,不需要担心使用固定值会造成的安全问题,RSA的安全性不会受影响 计算 \(ed = 1 (\mod\phi(n))\) ,得到 \(d\) 值用于解密 公钥:(N, e),私钥:(N, d) 一次RSA加解密: \[c = m^e \mod N\\ m = d^d \mod N\\ \] 解释: 即 \(m = (m^e)^d = m^{1\mod\phi(N)}=m^{h*\phi(N)+1}\mod N\) , 由欧拉定理 \(a^{\phi(n)}=1 \mod n\)

公钥、私钥、摘要、数字签名、证书

核能气质少年 提交于 2020-05-05 13:35:43
常用术语: 加密:encryption 解密:decryption 秘钥:secret key (公钥:public key 私钥:private key) 数字签名:digital signature 数字证书:digital certificate 摘要:digest 一、Base64 Base64也不是加密解密算法,只能算是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,对数据内容进行编码来适合传输(可以对img图像编码用于传输)。这是一种可逆的编码方式。 更多Base64相关知识可参考博客: base64 这64个字符为: a-z(26个)、A-Z(26个)、0-9(10个)、+ 和 / (2个),共64个。 二、散列 常见的散列算法有MD5、SHA1、HMAC。散列算法并不是加密算法。 1.md5(Message-Digest Algorithm 5) 密码通常用md5算法加密,虽然不能通过逆向的方式恢复成明文,但是却可以通过碰撞的方式得到原密码或者替代密码。 (简单具体例子,假设密码是数字2,而hash算法是对原数字进行平方运算,2的平方为4,实际上我们不需要也不可能通过逆向得到原密码2,但只需要找到其替代值-2就足以。) md5加盐 盐,是一串比较复杂的字符串。加盐的目的是加强加密的复杂度,当然这个“盐”越长越复杂,加密后破解起来就越麻烦

Python实现RSA无填充加密,兼容BouncyCastle

老子叫甜甜 提交于 2020-05-01 03:56:18
场景 某系统登录时密码经过前台rsa加密传给后端,为实现模拟登录需要原样生成加密串。 分析 前台通过RSA.js、BigInt.js、Barrett.js三个js文件实现加密,公钥通过ajax请求获得empoent、module。 rsa算法其实就是通过这两个参数计算实现公钥加密,所以正常情况下使用常规加密库即可达到目的。 但实际测试发现使用cryptography、pycryptodem等库加密结果与js输出不一致且每次都不同。其实常规库会按一定规则对原文随机填充后再加密,这样可保证相当的安全性。 于是考虑如何用python实现无填充的加密。 代码 经过搜索发现了相当简单(不安全)的实现方式,代码如下: if __name__ == ' __main__ ' : # 实为16进制串,前补0 e = ' 010001 ' # m也需要补00 m = '

Fiddlercore拦截并修改HTTPS链接的网页,实现JS注入

纵饮孤独 提交于 2020-04-28 18:49:10
原始出处:https://www.cnblogs.com/Charltsing/p/FiddlerCoreHTTPS.html Fiddlercore可以拦截和修改http的网页内容,代码在百度很多。 如果想用Fiddlercore拦截和修改Https的网页,你会遇到私密连接的问题,导致Chrome无法打开网页。如何解决这个问题呢? Fiddlercore拦截Https的原理是自己创建一个Https的证书,重新对网站的链接数据进行加密传输,所以,我们要通过代码创建一个https证书给Fiddlercore。 创建Https证书有两种方式,一种是通过MakeCert.exe ,另一种是通过 CertMaker.dll及BCMakeCert.dll来创建。 在官网说明中,明确的说了两点: 1、MakeCert.exe使用Windows API生成存储在用户的\Personal\Certificates存储中的证书。这些证书与iOS设备不兼容,后者需要证书中未由MakeCert.exe设置的特定字段。 2、CertMaker.dll使用BouncyCastle C#库(BCMakeCert.dll)从头开始生成新证书。这些 证书仅存储在内存 中,并与iOS设备兼容。 注意红色字!! 我们 在Fiddlercore编程的时候,通常采用dll方式创建证书,创建后的证书放在内存中。所以

【原】用Java编写第一个区块链(二)

走远了吗. 提交于 2020-04-21 07:11:56
  这篇文章将去介绍如何使用区块链进行交易。  【本文禁止任何形式的全文粘贴式转载,本文来自 zacky31 的随笔】 目标:   在 上一篇文章 中,我们已经创建了一个可信任的区块链。但是目前所创建的链中包含的有用信息还是比较少的。今天,我将会用交易信息来替换之前的 data 内容,我将会创建一个简单的加密货币,叫作 “ noobcoin ”。 前提: 已经了解了区块链基本知识 用到 GSON 和 bounceycastle 开始吧   在加密货币中,货币的所有权将会以交易的方式被传递,参与交易的人将会有一个地址,用来发送和接收交易金额。   上图,反映了一次交易过程。   首先,我们创建一个 Wallet 类,用来存放公钥和私钥。 import java.security.PrivateKey; import java.security.PublicKey; public class Wallet { public PrivateKey privateKey; public PublicKey publicKey; }   那么,创建好的公钥和私钥是干嘛用的呢?   其实,公钥对于货币来说就是我们所需要的地址。在每次交易过程中可以共享给交易方的。我们的私钥是用来加密每次的交易,这样保证了拥有私钥的人才能够进行交易。私钥只能被自己说知道!同时,公钥伴随着交易时传递给交易方

提高对称加密的安全性

自古美人都是妖i 提交于 2020-04-06 06:09:55
最近有空闲时间,翻腾了一下好多年前弄了好久的密码学,在这里和大家探讨一下提高对称加密安全性的一些思路。 本文使用的是java加解密工具包: bouncycastle(版本1.64) , 本文都基于此包进行展开 (推荐使用,包含了市面上常见的绝大多数算法,还包括了国密算法SM2,SM3,SM4,祖冲之算法等)。 对称加密:用相同的密钥进行加密和解密,密文可逆。 由于密文可逆,千万不可用于登陆密码加密存储 。 对称加密没有非对称加密安全性好,但为什么还有很多地方使用呢,是因为对称加密速度快,特别是很长的信息加密,用 对称加密速度快,而且性能要求低 ,还是有很多地方使用对称加密的,提升对称加密安全性就是本文探讨的内容。 一个正常加解密的流程如下: 选择一种算法 生成密钥 生成偏移量IV(也叫盐,沙子等),非必需 选择工作方式 选择填充方式 根据算法,工作方式,填充方式,实例化密码类Cipher(“ 算法/工作方式/填充方式 ”) init配置加解密模式 输入内容,进行加解密 输出处理后的字节,进行转字符串操作(加密一般转Base64,解密直接转字符串) 结束 常用算法如下,但 不限于此(字母顺序排列) : AES AESKW AESKWP AESWRAP AESWRAPPAD ARC4 ARCFOUR ARIA ARIAKW ARIAKWP ARIARFC3211WRAP

使用Hutools的对称加密时出现的一个问题

有些话、适合烂在心里 提交于 2020-03-02 08:37:50
首先 这不是Hutools的一个bug 而是pdfbox-app这个组件的bug 在2.0.0版本的pdfbox-app jar包中 集成了一个叫 bouncycastle的加密工具包(貌似是个jdk级别的jar)的源代码,pdfbox直接将其源码都写在自己jar里 所以我们这项目里其他的关于bouncycastle加密包的引用都取消了,这也就是问题导致的原因,pdfbox-app.jar包由于自身问题,以及bouncycastle本身的特性,就是会检测自身所在jar的签名是否有效,所以pdfbox-app.jar 的 2.0.0 版本的签名不知道为什么,无法通过检测,所以导致,加密不能使用抛出那个什么 jce 什么 cannot 啥的异常 简单点说就是,bouncycastle这个组件会对自身jar包进行签名检测,不符合就会抛异常,而pdfbox-app 2.0.0 集成了这个组件的所有源代码,而且在签名上没处理好,导致我们无法使用这个组件来加密,hutools加密代码底层有用到bouncycastle所以就无法运行加密了。 解决方式很简单 将pdfbox-app的版本由 2.0.0 改为2.0.13或者其他版本,问题解决。 顺便提一句,Hutools这个工具包真的很好用,为贡献者们点个赞,感谢你们的贡献。 来源: oschina 链接: https://my.oschina

Android RSA数据加密与Java服务端RSA私钥解密出错问题

空扰寡人 提交于 2020-03-02 08:11:09
1. 出错描述:服务RSA解密抛出javax.crypto.BadPaddingException: Decryption error 2.出错原因:Android系统使用的虚拟机(dalvik)跟SUN标准JDK是有所区别的,其中他们默认的RSA实现就不同。即Android端用Cipher.getInstance("RSA")方法进行加密时,使用的provider是Bouncycastle Security provider,Bouncycastle Security provider默认实现的是“RSA/None/NoPadding”算法,而服务器(PC)端用Cipher.getInstance("RSA")进行解密时,使用的是Sun的security provider,实现的是“RSA/None/PKCS1Padding”算法,所以,解密时会失败。 3. 解决方法:Android端的加密算法如下 /** * 公钥加密 * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 * */ public static byte[] encryptByPublicKey(byte[] data,String key) throws Exception{ //解密密钥 byte[] keyBytes =