主页 > imtoken钱包地址 > 你不得不知道的加解密算法

你不得不知道的加解密算法

imtoken钱包地址 2023-09-06 05:10:58

Java的加密知识也是Java常用的领域之一。 底层的加密技术确实非常复杂。 它用到了大量的数学知识,理解起来非常复杂。 但是,在Java语言中使用密码加密工具是非常简单的。 我们在Java中使用这些加密技术时,只需要了解原理和使用场景即可,具体的底层实现不需要研究。

常用的加密算法包括对称加密算法、非对称加密算法、哈希算法和数字签名。

顾名思义,对称加密就是加密和解密是对称的。 加密的时候用一个秘钥加密,解密的时候用同一个秘钥解密。 信息的发送者和接收者就密钥达成一致。 缺点是风险都在这把钥匙上,一旦被盗,信息就会暴露。 所以安全级别不够高。 常用的对称加密算法有DES、3DES、AES等,jdk中也有封装。

非对称加密,顾名思义就是加密和解密的过程不对称,不使用相同的秘钥。 非对称加密有公私钥对的概念,即有两把秘钥,一把是公钥,一把是私钥。 一对公钥和私钥有固定的生成方法。 加密时,用公钥加密,接收方再用对应的私钥解密。 使用时btc加密算法,接收方可以生成一对公私钥,然后将公钥传递给加密方,这样私钥就不会在网络中传输,不存在被盗的风险。 比如github底层的ssh协议就是公私钥的非对称加密。 而公钥可以从私钥推导出来,反之则不行,私钥不能从公钥推导出来。 常用的算法有RSA、ECC等,ECC也是比特币底层使用的比较普遍的算法。 通过与对称加密的对比,我们可以看出非对称加密解决了密钥传输中的安全问题。

哈希算法,简单地说,就是将任意数据转换成定长的字符串。 通过散列值推导出原文几乎是不可能的。 而且,两个不同的原文散列的结果一定是不同的。 常用的算法有MD5、SHA256等。 常见场景,md5常见场景是数据库密码存储。 sha256 可用于挖矿。

非对称加密还有一个问题,就是内容可能在发送前被篡改,因为公钥可能被窃取,所以小偷可以更改发送其他内容。

解决方案是数字签名。 数字签名和非对称加密是相反的。 还有公私钥对,但是私钥是用来签名的,公钥是用来验证签名的。 例如,发送方除了发送用公钥加密的密文外,还发送签名。 签名的内容通常是密文哈希后的字符串。 接收方首先验证签名是否正确。 如果正确,则密文被解密。 并且没有被篡改的内容。 请注意,签名和不对称使用两对不同的公钥和私钥。

以上是对几种加密算法的简单说明。 除了上述和base58等,比特币的底层安全还依赖于加密。 后面会一一介绍要用到的加密算法的介绍和使用,只是用到而已,底层不谈。

MD5

MD5即消息摘要算法5(Information-Digest Algorithm 5),用于保证信息传输的完整性和一致性。 是计算机广泛使用的哈希算法之一(又译为摘要算法、散列算法),MD5一般在主流编程语言中都有实现。 将数据(如汉字)计算成另一个固定长度的值是散列算法的基本原理。 MD5 的前身是 MD2、MD3 和 MD4。

MD5算法具有以下特点:

1、可压缩性:对于任意长度的数据btc加密算法,计算出的MD5值的长度是固定的。

2、计算方便:从原始数据中计算出MD5值很容易。

3、抗修改:对原始数据的任何修改,即使只修改一个字节,也会导致MD5值相差很大。

4. 抗碰撞性强:知道原始数据及其MD5值,很难找到一个MD5值相同的数据(即伪造数据)。

MD5的作用是让大容量的信息在用数字签名软件对私钥进行签名之前,先“压缩”成保密格式(即将任意长度的字节串转换成一定长度的十六进制数串) . 除了MD5,比较有名的还有sha-1、RIPEMD、Haval。

JDK自带md5加密算法,直接调用非常方便。 需要引入一个类:

导入 java.security.MessageDigest;

首先创建一个springboot项目,加上一个web,内容如下:

SHA256

学过Java的人对哈希算法并不陌生。 毕竟,每个类都有一个 hashCode 方法。

哈希算法(Hash Algorithm),又称散列算法、散列算法,是一种从任意文件中创建小型数字“指纹”的方法。 与指纹一样,哈希算法是一种使用较短信息来确保文件唯一性的标志。 这个标志与文件的每一个字节都有关系,很难找到反向规则。 因此,当原文件改变时,其标志值也会改变,从而告诉文件使用者,当前文件不再是你需要的文件。

一个优秀的哈希算法将能够实现:

转发快:给定明文和哈希算法,可以在有限的时间和有限的资源内计算出哈希值。

逆向难度:给定(几个)哈希值,在有限时间内很难(基本不可能)逆向明文。

Input Sensitive:如果对原始输入信息稍作修改,得到的哈希值应该看起来很不一样。

冲突避免:很难找到两段内容不同的明文,使得它们的哈希值一致(发生冲突)。 即对于任意两个不同的数据块,哈希值相同的可能性极小; 对于给定的数据块,要找到哈希值相同的数据块是极其困难的。

但是在不同的使用场景中,比如数据结构和安全领域,会强调某些特性。

安全哈希算法(英文:Secure Hash Algorithm,缩写为SHA)是密码哈希函数族,是一种通过FIPS认证的安全哈希算法。 一种算法,可以计算出数字消息对应的固定长度字符串(也称为消息摘要)。 而如果输入的消息不同,很大概率对应的是不同的字符串。

SHA 系列的五种算法是 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512。 主要适用于数字签名标准(DigitalSignature Standard DSS)中定义的数字签名算法(Digital Signature Algorithm DSA)。 比特币的内部是SHA-256算法。

简单来说,就是将一个对象的多个密钥不重复信息组合起来,通过算法生成一个加密的字符串。

继续上一个项目,在对应的包下建一个工具类:

包 btcdemo.btcdemo.security;

公共类 Sha256Utils

引入的加密类同md5:

导入 java.security.MessageDigest;

下面是算法的具体内容:

aes加密和解密算法_aes算法加密 举例_btc加密算法

以下是该算法的测试类内容:

aes加密和解密算法_aes算法加密 举例_btc加密算法

运行可以看到如下结果:

aes加密和解密算法_btc加密算法_aes算法加密 举例

当前目录结构如下:

aes加密和解密算法_aes算法加密 举例_btc加密算法

项目代码:

BASE64&BASE58

Base64是互联网上传输8Bit字节码最常用的一种编码方式。 Base64 是一种基于 64 个可打印字符表示二进制数据的方法。 可以查看RFC2045~RFC2049,里面有MIME的详细规范。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传输长标识信息。 例如,在 Java Persistence 系统 Hibernate 中,Base64 用于将较长的唯一标识符(通常是 128 位 UUID)编码为字符串,用作 HTTP 表单和 HTTP GET URL 中的参数。 在其他应用程序中,通常需要将二进制数据编码成适合放置在 URL 中的形式(包括隐藏的表单域)。 这时候使用Base64编码是不可读的,需要解码后才能读取。

base64编码需要将3个8位字节(3*8=24)转换为4个6位字节(4*6=24),然后在6位前面加上两个0,组成8位字段形式. 如果剩余字符小于3个字节,则用0补足,输出字符使用'=',所以编码后的输出文本末尾可能出现1个或2个'='。

jdk工具包自带一个base64工具类。 使用base64的方法也很简单。 首先创建一个工具类:

btc加密算法_aes算法加密 举例_aes加密和解密算法

base64是可逆的,加解密后的内容如下:

aes加密和解密算法_aes算法加密 举例_btc加密算法

可以看到使用很简单,下面是测试类的内容:

btc加密算法_aes加密和解密算法_aes算法加密 举例

执行测试方法,结果如下:

btc加密算法_aes加密和解密算法_aes算法加密 举例

可以看到base64很简单。

Base58和base64一样,是一种将二进制转换为可视化字符串的算法,主要用于大整数值的转换。 不同的是,转换后的字符串去除了几个不明确的字符,如0(零)、O(大写字母O)、I(大写字母i)和l(小写字母L),以及几个影响双击选择的字符,如/、+。 得到的字符集恰好是 58 个字符(包括 9 个数字、24 个大写字母和 25 个小写字母)。 在不同的应用实现中,base58最终查询的字母可能不同,所以没有具体的标准。

可见base58是base64的人性化版本,是站在用户的角度考虑的。

新建Base58工具类,目录结构如下:

aes加密和解密算法_aes算法加密 举例_btc加密算法

工具类的大致内容结构如下:

aes算法加密 举例_aes加密和解密算法_btc加密算法

由于内容太多,大家可以下载源码查看。

这是测试代码:

aes算法加密 举例_btc加密算法_aes加密和解密算法

运行结果如下:

aes算法加密 举例_aes加密和解密算法_btc加密算法

可以看到,base58的用法是一样的。

项目代码:

结尾