imtoken钱包安卓官网下载|对称加密
深入理解对称加密和非对称加密 - 知乎
深入理解对称加密和非对称加密 - 知乎首发于问我学院切换模式写文章登录/注册深入理解对称加密和非对称加密问我学院问我学院,专注计算机信息,区块链,人工智能和大数据等技术研究关于对称加密和非对称加密 我们都知道,密码体制有两种: 对称密码体制( 又称为单钥密码体制) 和非对称密码体制( 又称为双钥密码体制或公钥密码体制) 。对称密码体制使用相同的密钥( 秘密密钥) 对消息进行加密/解密,系统的保密性主要由密钥的安全性决定,而与算法是否保密无关。 对称密码体制设计和实现的中心是: 用何种方法产生满足保密要求的密钥以及用何种方法将密钥安全又可靠地分配给通信双方。对称密码体制可以通过分组密码或流密码来实现,它既可以用于数据加密,又可以用于消息认证。非对称密码体制使用公钥加密消息,使用私钥来解密。使用非对称密码体制可增强通信的安全性。 在密码学体系中,对称加密、非对称加密、单向散列函数、消息认证码、数字签名和伪随机数生成器被统称为密码学家的工具箱。其中,对称加密和非对称加密主要是用来保证机密性;单向散列函数用来保证消息的完整性;消息认证码的功能主要是认证;数字签名保证消息的不可抵赖性。这篇文章所要讲诉的就是保证消息的机密性的对称密码和非对称密码。密码学的发展简史 密码学的发展大致可以分为 3 个阶段: 1949 年之前的古典密码学阶段; 1949 年至 1975 年密码学成为科学的分支; 1976 年以后对称密钥密码算法得到进一步发展,产生了密码学的新方向—公钥密码学。1976 年,W.Diffie 和 M.Hellman 在发表的文章“密码学的新方向”中首次公开提出了公钥密码( Public-key Cryptography) 的概念。公钥密码的提出实现了加密密钥和解密密钥之间的独立,解决了对称密码体制中通信双方必须共享密钥的问题,在密码学界具有划时代的意义。本文的结构 文章会对称加密和非对称加密的加密的特点进行介绍,比较对称加密和非对称加密的优缺点,介绍几种比较经典的对称加密算法和非对称加密算法,例如:DES、 AES、RSA 和 ECC 等。 本文的混合加密所指的内容是取对称加密和非对称加密的优点,摒弃他们的缺点而形式的高效的混合加密方案,这种方式在目前的加密系统中的应用也很广泛。对称加密 对称加密又称但密钥加密,整个加密过程中只使用一个密钥。所谓对称其实就是使用一把密钥加密,使用同一把密钥解密。对称加密由于加解和解密使用的是同一个密钥算法,故而在加解密的过程中速度比较快,适合于数据量比较大的加解密。 对称加密的主要有优点就是算法公开、计算量小、加密速度快、加密效率高;但是它也存在强大的缺点,缺点就是密钥协商过程中,一旦密钥泄露,别人可以获取到密钥,这样也能对密文进行解密。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的独一密钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。 常用的对称加密算法有 DES、3DES、AES、TDEA、Blowfish、RC2、RC4 和 RC5 等。两种经典的对称加密算法DES DES 加密解密算法最初由美国 IBM 公司研究人员所设计发明,且为第一个公开的商用密码算法标准,自诞生以来便得到了 ISO 的一致认可。DES 是分组密码算法的典型代表,它的明文分组长度为 64bits,密钥长度为 64bits,其中包括有 8bits 的奇偶校验,因此有效密钥长度为 56bits。DES 加密解密算法使用的过程相同,且可以随时均都可以进行变动。它们其中有极少数被认为是易破解的弱密钥,但是很容易抛开它们不使用,因此其自身安全性主要依赖于有效密钥。 DES 算法加密过程首先先对明文分组进行操作,需要加密的明文分为每块 64bits 的固定大小。下图所示左右两部分分别为64bits 的明文分组加密过程和其 16 个子密钥生成的过程。DES 核心算法模块IP 初始置换IP 初始置换,在第一轮运算之前执行,对输入的分组采用下面的数字进行 IP 初始变换,按照从左向右、从上向下进行置换。58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7子密钥获取流程子密钥的获取流程如下图 此处,用户输入 64 位的密钥。根据密钥置换表 PC-1,将 64 位变成 56 位密钥(此处去掉了奇偶校验位)。 PC-1 置换得到的 56 位密钥。此处密钥被分为前 28位 C0 和后 28 位 D0。分别对它们进行循环左移,C0 左移得到 C1,D0 左移得到 D1。将 C1 和 D1 合并变成 56 位。然后通过 PC-2 表进行压缩置换,得到此轮的 48 位子密钥 K1。 再对 C1 和 D1 进行相同的左移和压缩置换,获取下一轮的子密钥……一共进行 16 轮,于是可以得到 16 个 48 bits 的子密钥。E盒扩展 E 盒扩展置换,则是将右半部分 32bits 按照 8 行 4 列方式依次排列,得到一个 8*4的二维矩阵,然后根据如表 2 所示的 E 盒扩展置换表扩展为 8*6的二维矩阵。32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 1异或运算 将 P 盒置换的结果与最初的 64bits 分组的左半部分异或,然后左、右半部分交换,接着开始另一轮。S 盒扩展 当产生了 48bits 密钥后就可以和明文进行异或运算,便可得到 48bits 的密文。再开始下轮的 S 盒迭代运算,其功能是把 6bit数据变为 4bits 数据,每个 S 盒是一个 4 行、16 列的表。每个 S盒的使用方法为:S 盒收到 6bits 的输入,6bits 的第 1 个 bit 和最后 1 个 bits 构成的 2 位二进制为该 S 盒行号,中间的 4bits 二进制为该 S 盒的列号,然后根据行号和列号查 S 盒定义表得到对应的值(通常为十进制),该值就是 S 盒变换的输出,并转化为二进制。P 盒置换 S 盒代替运算之后,输出 32bits,作为 F 函数最后一个变换 P 盒置换的输入。将该 32bits 位数据进行 P 盒置换,置换后得到一个仍然是 32 bits 的结果,此处可得 F 函数的输出值。逆初始置换 DES 完成 16 轮变换后,得到 64bits 数据作为 IP-1 逆初始置换的输入,经过 IP-1 逆初始置换表(如表 3 所示),64bits 输入数据位置重新编排,就得到 64bits 的密文。40 8 48 16 56 24 64 32 39 7 47 15 55 23 63 31 38 6 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 33 1 41 9 49 17 57 25AES AES 加密算法为分组密码,分组长度为 128 位即 16 个字节,密匙长度有128、192 或 256 位,根据密匙 长 度的不同,加密的轮数也不同,本文采用长度为 128 位的密匙,加密轮数为 10 轮。AES 加密算法不仅编码紧凑、设计简单而且可抵抗多种类型的攻击,其基本结构包括 4个部分。这四个部分分别为字节替换、行位移、列混合和轮密匙加。字节替换(SubBytes) 字节替换也就是通 过 S-BOX 对字节元素进行非线性的变换,S-BOX 由有限域 GF(2 的 8 次方) 上的乘法求逆运算和仿射变换运算而来,通过查表的方式即可直接得到变换前后的字节元素,替换后字节元素至少有两位发生变换,能 充分打乱原来的字节元素,本文所介绍的 AES 加 密 算 法 就是对 S-BOX 进行改 进 而 来。具体替换规则为假设一字 节为 xy,则 S-BOX 中第x行第y列所对应的元素就是替换后的元素。行位移(ShiftRows) 行位移是 AES 加密算法中的一个简单线性运算,即在 4 x 4 的状态矩阵中,把第i行循环左移i个字节(i=0, 1, 2, 3)。列混合(MixColumns) 列混合是将状态矩阵中的每一列看成一个多项式,让其与一个固定的多项式 a(x) 相乘,再做模多项式 m(x) = x4(x的四次方) + 1 的运算,其中 a(x)=’03‘x3(x的3次方)+ ’01‘x2(x的平方)+ '01'x + ‘02’。轮密匙加(AddRoundKey) 轮密匙加变换就是让状态矩阵与经过密匙扩展得到的子密匙做异或运算,因此轮密匙加变换的逆变换就是其本身,其中子密匙是原始密匙通过密匙扩展算法得到的。AES 算法流程下图是整个算法的流程图 AES 加密算法先将 128 位的明文进行分组,得到一个 4x4 的明文状态矩阵作为算法的输入,然后选取密匙矩阵先对明文状态矩阵做一次轮密匙加变换,再经过 10 轮的轮函数加密,轮函数操作依次为字节替换、行位移、列混合和轮密匙加,其中由于最后一轮的列混合不仅不会提高安全性,反而会拉低 算 法 运 算 速 度,故该轮丢弃列混合变换。解密算法仍为 10 轮,由于算法的4个轮操作均为可逆变换,因此解密过程就是用与加密过程同样的密匙对每一轮的加密操作进行逆运算。非对称加密 非对称加密又称为公钥密码,该技术是针对私钥密码体制(对称加密算法)的缺陷被提出来的,非对称加密会产生两把密钥,分别为公钥(Public Key)和私钥(Private Key),其中一把密钥用于加密,另一把密钥用于解密。非对称加密的特征是算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就高了很多。 常用的非对称加密算发有 RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。两种经典的非对称加密算法RSA RSA 算法是一种迄今为止理论上比较成熟和完善的公钥密码体制,是非对称密码体制的典型代表。在网络、信息安全等许多方面都使用 RSA 算法,特别是 RSA 算法典型应用在通信中的数字签名,可实现对手的身份、不可抵赖性验证。在身份认证、信息安全、电子商务中有着广泛的应用前景。RSA 的算法流程RSA 算法由密钥的产生、加密算法和解密算法 3 个部分组成。密钥的产生过程如下:产生两个大素数 p 和 q ;计算 n = p × q ,欧拉函数 φ(n) =(p - 1)(q - 1)选择整数 e ,使其满足条件:1 < e < φ(n) ,且gcd(e,φ(n)) = 1(注:gcd () 函数计算两个数的最大公约数);计算 e 的逆元 d :d∙e ≡ 1 mod φ(n)(注:由于gcd(e,φ(n)) = 1,则 d 一定存在);取序对 (e,n) 为公钥,可公开;(d,n) 为私钥,对外保密。加密算法过程如下将要发送的字符串分割为长度为 m < n 的分组,然后对分组 mi 执行加密运算,得到密文 ci :ci ≡(mi)e mod n解密算法过程如下收到密文 ci 后,接收者使用自己的私钥执行解密运算,得到明文 mi :mi ≡(ci)d mod nRSA 详细的算法设计流程大素数的产生和测试Miller-Rabin 算法是一种基于概率的素数测试方法,在密码学的素数产生中,由于该算法的速度快、原理简单、易于实现,成为进行素数检测的最佳选择。Miller-Rabin 算法是对费马算法改进,它的操作步骤如下:计算 m ,满足 n = (2r 2的r次方 ) m + 1;选择随机数 a ∈[1,n] ;若 am mod n = 1 ,或满足 aim mod n = n - 1 ,则 n 通过随机数 a 的测试;再取不同 a 要的值对 n 进行 t = 5 次测试,如果每次测试结果为 n 是素数,则以高概率判定 n 是素数。假设 n 通过 t 次测试,则判定结果错误的概率是1/4t;若只通过一次测试,素数判定的错误概率是 25%。流程图如下:密钥 e 生成模块 通过上面的的大素数生成模块,可以得到大素数 p和大素数 q ,根据欧拉函数 φ(n) =(p - 1)(q - 1) ,同时密钥 e 与 φ(n) 互质,根据中国剩余定理可以计算密钥e 。过程如下:密钥 d 生成模块 通过大素数生成模块得到大素数 p 和 q ,密钥 e 生成模块,根据 1 = ed mod ( p - 1) (q - 1) 。利用中国剩余定理计算 e 的乘法逆元 d 。快速指数算法 得到 e 后,就可以通过公钥 (e,n) 进行加密得到密文 C 。在 RSA 加密过程中,为了计算 ci ≡(mi)e mod n ,采用快速指数算法。将快速指数算法描述为三元组(M,E,Y) ,其初始值为 (M,E,Y ) =(mi,e,1) 。重复执行以下操作:①若 E 是奇数,则 Y = MY mod n ,E = E - 1 ; ②若 E 是偶数,则 X = XX mod n ,E = E/2 。 最终,当 E = 0 时,则 Y = X^E mod n 。RSA加密和解密算法设计过程如下:ECC 椭圆曲线加密算法(ECC)是基于椭圆曲线数学的一种非对称密码算法,是建立在基于椭圆曲线的离散对数问题上的密码体制。随着分解大整数方法的进步以及各方面的完善,RSA 算法渐渐不能满足现状,ECC 算法的需求性逐渐增大。ECC 以其明显的“短密钥”优势得到了广泛应用,并逐渐被确定为许多编码方式的数字签名标准。当然,ECC 还有许多未解决的问题,不过这种引用了丰富数学理论的算法,也印证了将更多数学有较大可行性理论应用到密码学这一领域中。 首先从数学角度阐释算法加密原理,ECC椭圆曲线加密算法数学基础是利用有限域上椭圆曲线离散对数问题(ECDLP)的计算困难性,所谓椭圆曲线是指由韦尔斯特拉方程。其椭圆曲线方程如下:y2 + a1xy + a2 y = x3 + a3x2 + a4 x + a5下面是椭圆曲线方式图示 其中,系数 ai 定义在某个域上(密码算法中需要把之前连续曲线变为有限域上的点,故 ai 也定义在有限域中)。曲线上所有点和一个无穷远点构成一个集合连同定义上的加法(eg:a+b≡c (mod p))构成阿贝尔群。由于曲线上每一点都是非奇异点,故可在椭圆曲线上找到两点 P、Q,且存在如下关系式: 由此可见,已知 m、P 求 Q 较为容易,反之由 Q 逆向求 m、P 难度却较大,椭圆曲线密码正是基于该机制来展开设计及应用。混合加密-对称加密和非对称加密的实际应用场景 所谓混合加密就是使用在实际的应用中把对称加密和非对称加密结合起来使用。我们都知道非对称加密算法比对称加密算法慢数千倍,但在保护通信安全方面,非对称加密算法却具有对称密码难以企及的优势。所以在实际的应用中,都是对称加密与非对称加密混合使用。取其优势,去其糟粕,达到完美使用的一个目的。 对称加密技术,即专用密钥加密技术或单钥密码技术,加密密钥与解密密钥一致,发送方与接收方用同一组的公私密钥对加密或者解密信息。数据加密的一个关键要求是有相同的密钥才能解密。因为通信双方共享密钥,如果密钥丢失或泄露,那么获取密钥的人就可以加密或者解密数据,所以为保证消息的机密性必须保障密钥的安全。 这种算法比较简单且计算量比较小,对网络开放、从而能够效率高地加密。同时存在的缺点,一是通讯双方基于通过非面对面的方式协商一个共同的密钥,因此不能保证协商过程的安全性。二是通讯双方每次进行数据传输时都使用惟一密钥,这使得对称加密技术在开放型的网络中需要使用和生成大量的密钥,对于密钥的管理就成为用户的很大负担。三是对称加密算法只能对数据进行加解密,保证数据的机密性,但无法验证通讯双方的真实身份,不能确定数据的完整性。 非对称密钥加密技术,由公钥和私钥形成一个密钥对,其中公钥向公众公开,私钥归密钥持有人单独保管。通讯双方使用非对称密钥对数据进行加密和解密时,必须使用相互匹配的公钥和私钥。它有两种方式:一种是发送方用接收方的公钥来加密信息,接收方用其私钥解密信息,这样接收方可以收到多个发送方传来的加密数据,且此加密数据只有接收方一个用户可以解读;另一种即发送方利用自身的私钥加密信息,接收方用对方公钥解密信息,这样一个信息有可能被多个接收方解密。 非对称密钥加密技术的优点是简化了密钥的发放及管理的过程,支持数字签名等安全认证技术,缺点是加密和解密的计算过程特别复杂,运行数据加密和解密的速度比较慢。原文链接:http://www.wenwoha.com/blog_detail-7.html支持平台:链眼社区http://www.chaineye.info椭圆曲线(原木姜子科技)http://www.gingernet.vip/ 发布于 2021-06-03 12:18密码加密非对称式加密对称加密赞同 13添加评论分享喜欢收藏申请转载文章被以下专栏收录问我学院专注软硬件开发,测试和运维平台技术文
对称加密与非对称加密 - 知乎
对称加密与非对称加密 - 知乎切换模式写文章登录/注册对称加密与非对称加密余腾靖找前端工作加密在编程中的应用的是非常广泛的,尤其是在各种网络协议之中,对称/非对称加密则是经常被提及的两种加密方式。对称加密我们平时碰到的绝大多数加密就是对称加密,比如:指纹解锁,PIN 码锁,保险箱密码锁,账号密码等都是使用了对称加密。 对称加密:加密和解密用的是同一个密码或者同一套逻辑的加密方式。 这个密码也叫对称秘钥,其实这个对称和不对称指的就是加密和解密用的秘钥是不是同一个。我在上大学的时候做过一个命令行版的图书馆管理系统作为 C 语言课设。登入系统时需要输入账号密码,当然,校验用户输入的密码本身就是一种对称加密,用户必须输入的密码必须和你之前设置的账号密码相同。当时我选择将账号密码存放在本地文件中,但是如果这个文件被窃取了,而且没有对密码本身进行加密的话密码就泄露了。那么如何对存储在文件中的密码进行加密呢?我当时采取的方式(也可以理解为一种加密算法)是:将用户设置的账号密码的每一个字符取它的码值然后加上一个固定的值比如 6,然后存储的时候存储计算后的码值字符串。用 js 来模拟一下:// 加密用户密码过程
const sourcePassword = 'abcdef'; // 用户账号密码
// 加密后的存储在本地文件的账号密码
const encryptedPassword = [...sourcePassword].map((char) => char.codePointAt(0) + 6).join();
console.log(`加密后的账号密码是:${encryptedPassword}`) // => 加密后的账号密码是:103,104,105,106,107,108
// 解密过程
const decryptedPassword = encryptedPassword.split(',').map((codePoint) => String.fromCodePoint(codePoint - 6)).join('');
console.log(`解密后的账号密码是:${decryptedPassword}`); // => 解密后的账号密码是:abcdef
上面对用户账号密码加密的过程虽然没有明显涉及到用于加密的密码,但是加密解密用的都是同一套逻辑:取字符的 ascii 码值加 6,其实这也是对称加密。其实也可以理解为加密密码就是加密算法本身,知道了加密算法就能解码出账号密码。有些软件支持对数据进行加密如 rar 加密的时候需要你输入密码,然后解密的时候需要我们输入设置的加密密码。其实回到到我上面说的那个很简单的加密算法,系统可以设计成让用户可以设置一个用于加密账号密码的加密密码。这里简化为一个数字,然后系统在存储用户账号密码的时候就不是像之前那样每个用户都是加上固定的 6 了,而是加上用户设置的这个数字。现在你这个加密逻辑就可以像 rar 公开压缩算法那样公开,即便是被攻击者知道了加密算法和加密后的账号密码,如果不知道加密密码还是无法获取用户账号密码。这里的加密密码和解密密码用的都是同一个密码,对应到上面那个系统就是 6,所以也是对称加密。使用 nodejs 来进行对称加密nodejs 的 crypto 模块是一个专门用于各种加密的模块,可以用来取摘要(hash),加盐摘要(hmac),对称加密,非对称加密等。使用 crypto 进行对称加密很简单,crypto 模块提供了 Cipher 类用于加密数据,Decipher 用于解密。常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6,这里演示下使用 AES 算法进行对称加密。const crypto = require('crypto');
/**
* 对称加密字符串
* @param {String} password 用于对称加密的秘钥
* @param {String} string 被加密的数据
* @return {String} encryptedString 加密后的字符串
*/
const encrypt = (password, string) => {
// 使用的对称加密算法是:aes-192-cbc
const algorithm = 'aes-192-cbc';
// 生成对称加密秘钥,salt 用于生成秘钥,24 指定秘钥长度是 24 位
const key = crypto.scryptSync(password, 'salt', 24);
console.log('key:', key); // => key:
console.log(`秘钥长度: ${key.length}`); // => 秘钥长度: 24
// 初始化向量
const iv = Buffer.alloc(16, 0);
// 获得 Cipher 加密类
const cipher = crypto.createCipheriv(algorithm, key, iv);
// utf-8 指定被加密的数据字符编码,hex 指定输出的字符编码
let encryptedString = cipher.update(string, 'utf8', 'hex');
encryptedString += cipher.final('hex');
return encryptedString;
};
const PASSWORD = 'lyreal666';
const encryptedString = encrypt(PASSWORD, '天分不够努力来凑');
console.log(`加密后的数据是:${encryptedString}`); // => 加密后的数据是:1546756bb4e530fc1fbae7fd2cf9aeac0368631b54581a39e5c53ee3172638de
/**
* 解密字符串
* @param {String} password 加密密码
* @param {String} encryptedString 加密后的字符串
* @return {String} decryptedString 解密后的字符串
*/
const decrypt = (password, encryptedString) => {
const algorithm = 'aes-192-cbc';
// 采用相同的算法生成相同的秘钥
const key = crypto.scryptSync(password, 'salt', 24);
const iv = Buffer.alloc(16, 0);
// 生成 Decipher 解密类
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decryptedString = decipher.update(encryptedString, 'hex', 'utf8');
decryptedString += decipher.final('utf8');
return decryptedString;
};
const decryptedString = decrypt(PASSWORD, encryptedString);
console.log(`解密后的数据时:${decryptedString}`); // => 解密后的数据时:天分不够努力来凑
非对称加密非对称加密用的是一对秘钥,分别叫做公钥(public key)和私钥(private key),也叫非对称秘钥。非对称秘钥既可以用于加密还可以用于认证,咱先聊加密。 加密有一个密码就行了,为啥要整个非对称加密要两个密码呢? 黑人问号.jpg 我相信肯定会有人和我一样有过这样的想法。其实对称加密只要保证加密的密码长度足够长的话,被加密的数据在拿不到密码本身的情况下一般是安全的。但是有个问题就是在实际应用中比如加密网络数据,因为加密和解密使用的是同一个秘钥,所以,服务器和客户端必然是要交换秘钥的,而正是因为非对称秘钥由于有一个交换秘钥这一过程可能会被中间人窃取秘钥,一旦对称加密秘钥被窃取,而且被分析出加密算法的话,那么传输的数据对于中间人来说就是透明的。所以对称加密的致命性缺点就是无法保证秘钥的安全性。那么非对称加密就能保证秘钥的安全性了吗?是的,秘钥可以大胆的公开,被公开的秘钥就叫公钥。非对称加密的秘钥由加密算法计算得出,是成对的,可以被公开的那个秘钥称之为公钥,不能公开的那个私有的秘钥叫私钥。在使用 github 等 git 仓库托管平台的时候,我们一般都会配置 ssh 公钥,生成一对秘钥我们可以采用下面的命令:上面使用 ssh-keygen 程序指定加密算法为 rsa,在当前目录生成一对秘钥 key,key.pub。key 是私钥,key.pub 是公钥,后缀 pub 全拼明显是 public 嘛。来看一下生成的具体内容:这个 key.pub 是个公钥,公钥就是被设计来可以随意公开的。我们把这个公钥配置到托管平台,就可以不用每次和 github 通信都要输入密码了。这对公私钥有一个特点,同时也是非对称加密为什么安全的关键就是:使用秘钥对中的一个秘钥加密,加密后的数据只能通过另一个秘钥解密。也就是说使用一对秘钥中的公钥加密数据,只能通过另一个私钥解密出数据。或者反过来,使用一对秘钥中的私钥进行加密的数据,只能通过另一个公钥解密出来。由此可见,从加密的角度来看,公钥和私钥其实作用是等同的,都可以用于加密或解密,只不过当我们使用非对称秘钥用于加密数据时往往是用公钥进行加密。在 https 的加密中,加密传输的数据本身使用的是对称加密,加密对称秘钥时使用的非对称加密。整个过程是这样的:server 端先生成一对非对称秘钥,将可以公开的公钥发送给 client 端,client 端也决定此次数据传输使用的对称加密算法和对称秘钥,然后利用 server 端给的公钥,对对称秘钥进行加密传输。server 端接受到 client 端发送的对称加密算法和秘钥后,server 端和 client 端的数据传输都使用这个对称秘钥和算法进行对称加密。整个过程中即便 server 端的公钥被中间人知道了内容,但是没有保存在 server 端的私钥,你是无法破译使用公钥加密的对称秘钥的。公钥原本就是可以被随意公开的,拿到也没用,解密需要的是私钥。非对称加密或者说公钥加密之所以能保证加密安全就是因为私钥是保密不公开的,攻击者没有私钥无法破译。可能会有人有疑问:为什么需要使用非对称加密对对称秘钥加密呢?那是因为交换对称秘钥时可能被第三方窃取,对称秘钥被窃取了那对称加密就没意义了。还有为什么不直接使用非对称加密来加密传输内容而只是加密对称秘钥?非对称加密不是对称加密更安全吗?这就和对称加密与非对称加密的特点有关系了。非对称加密和对称加密对比对称加密是一个秘钥,非对称加密是一对,两个秘钥非对称加密比起对称加密更安全,因为不存在秘钥泄露问题,公钥即便被知道也没关系由于使用非对称加密在计算上特别复杂,所以一般来说对称加密的加密解密的速度相对于非对称加密快很多非对称秘钥还可以用于认证由于以上第三条,所以在 https 中传输数据时不会使用非对称加密加密传输数据,传输数据时有可能数据本身很大,那样的话非对称加密更耗时了,所以传输数据时不会使用非对称加密的方式加密。使用 nodejs 演示非对称加密常见的非对称加密有 RSA、ECC(椭圆曲线加密算法)、Diffie-Hellman、El Gamal、DSA(数字签名用),这里演示一下 RSA 加密。const crypto = require('crypto');
// 秘钥加密短语
const passphrase = 'lyreal666';
// rsa 指定非对称秘钥算法为 rsa
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 4096, // 指定秘钥长度
publicKeyEncoding: {
type: 'spki', // 公钥编码格式
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8', // 私钥编码格式
format: 'pem',
cipher: 'aes-256-cbc',
passphrase,
},
});
/**
* 使用公钥加密
* @param {String} publicKey 用于对称加密的秘钥
* @param {String} string 被加密的数据
* @return {String} encryptedString 加密后的字符串
*/
const encrypt = (publicKey, string) => {
// 使用公钥加密
return crypto.publicEncrypt({ key: publicKey, passphrase } , Buffer.from(string)).toString('hex');
};
/**
* 使用私钥解密字符串
* @param {String} privateKey 私钥
* @param {String} encryptedString 加密后的字符串
* @return {String} decryptedString 解密后的字符串
*/
const decrypt = (privateKey, encryptedString) => {
return crypto.privateDecrypt({ key: privateKey, passphrase } , Buffer.from(encryptedString, 'hex'));
}
const string = '说好不哭,不爱我就拉倒ヽ(`⌒´)ノ';
const encryptedString = encrypt(publicKey, string);
console.log(`公钥加密后的结果:${encryptedString}`); // => 公钥加密后的结果:caf7535c46146f5...
const decryptedString = decrypt(privateKey, encryptedString);
console.log(`私钥解密后的结果:${decryptedString}`); // => 私钥解密后的结果:说好不哭,不爱我就拉倒ヽ(`⌒´)ノ
非对称密钥认证非对称加密有时也叫公钥加密,而非对称秘钥认证也被称为私钥认证。我们说使用非对称秘钥对数据进行认证其实就是说确认一个数据是否有没有被篡改过。非对称秘钥除了用于加密数据,用于认证也是非常广泛的,比如手机 apk 的签名, https 中的证书。原理很简单:比如现在我要认证一个 apk 的代码是否被串改过,首先准备一对非对称秘钥,一般来自权威机构。官方在打包 apk 时不但包含应用代码,还带上一个签名,这个签名这里简单理解为使用私钥对应用代码的 hash 值加密后的数据。在安装 apk 时,android 系统会提取 apk 中的签名,使用公钥解密签名得到原始应用代码的 hash,然后和原始应用代码的 hash 进行比对,如果内容相同,那么 apk 没有被篡改过。如果 apk 的应用代码被第三方修改了,那么从签名中解密出来的 hash 和应用代码的 hash 肯定是不同的。所以可以起到确保应用代码没有篡改,也就是认证。认证的关键其实是因为签名的存在,签名必须保证能拿到 apk 原始应用代码的 hash。至于如何保证签名没有被篡改不在本文讨论范围。可能有人看了上面对 apk 认证的过程会有这么一个疑问:使用私钥对内容加密可以达到认证的目的,那能不能使用公钥加密来认证呢?答案肯定是不能的,如果你使用公钥对内容进行加密,那中间人要篡改你的内容,伪造签名超简单,直接使用公钥对伪造后的内容的 hash 加密就可以了。所以使用非对称秘钥可以用于认证的另一个关键就是私钥是不公开的,中间人没法获取私钥,也就没法伪造签名。几个疑问hash 算是加密吗?我觉得不算,hash 是不可逆的,加密应该是可以根据加密后的数据还原的。base 64 算是加密吗?是对称加密,对称秘钥就是 base 64 字符码表。非对称加密绝对安全吗?没有什么加密是绝对安全的,非对称加密存在交换公钥时公钥被篡改的问题。由于我并没有专门学过密码学,以上内容皆由我通过总结以往所学所了解的知识所写,难免会有偏颇之处,甚至说带有很明显的个人观点。欢迎读者在评论处指出文中错误和讨论。感谢您的阅读,如果对你有所帮助不妨加个关注,点个赞支持一下O(∩_∩)O。本文为原创内容,首发于个人博客,转载请注明出处。发布于 2019-09-23 00:47加密前端入门HTTPS赞同 4014 条评论分享喜欢收藏申请
一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现 - 知乎
一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现 - 知乎切换模式写文章登录/注册一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现教IT的无语强攻城狮无偿领取网络安全入门到进阶学习籽料可点击这个链接:瓜子:零基础学网络安全有什么建议?如何入门?——来自一位年薪80W的网工倾情讲解它是一种消息摘要算法。该算法在信息安全领域,有很多重要的应用场景,比如:用户密码保护、数字签名、文件完整性校验、云盘妙传等。单向散列加密只能够对消息进行加密(严格来说是计算消息的摘要),想要实现对密文解密,需要使用其它加密方式了。今天介绍一个在信息安全领域中,比较重要的加密方式——对称加密。下面是本篇讲述内容: 加密、解密和密钥加密(Encrypt)是从明文生成密文的步骤,解密(Decrypt)是从密文还原成明文的步骤,而这两个步骤都需要用到密钥(Key)。这和我们现实中,用钥匙上锁和开锁是一样的。什么是对称加密对称加密(Symmetric Cryptography)是密码学中的一类加密算法,这类算法在加密和解密时,使用相同的密钥。对称加密又称为共享密钥加密,其最大的缺点是,对称加密的安全性依赖于密钥,一旦泄露,就意味着任何人都能解密消息。对称加密的优点是加密速度快,所以在很多场合被使用。常见算法本节介绍对称加密的一些常见算法,包括DES、3DES和AES。DES算法DES(Data Encryption Standard,中文:数据加密标准),是一种对称加密算法。该算法在1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并于1977年被发布,随后在国际上广泛流传开来。然而,随着计算机的进步,DES 已经能够被暴力破解,所以该算法已经不安全了。DES是一种分组密码(Block Cipher,或者叫块加密),即将明文按64比特进行分组加密,每组生成64位比特的密文。它的密钥长度为56比特(从规格上来说,密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实际长度为56比特)。3DES算法三重数据加密算法(Triple Data Encryption Algorithm,缩写为TDEA),简称3DES(Triple-DES),是DES的增强版,相当于对每组数据应用了三次DES算法。由于DES算法的密钥长度过短,容易被暴力破解,为了解决这一问题,设计出了该算法。它使用简单的方法,通过增加DES密钥长度的方式来避免类似攻击,而不是一种全新的密码算法。该算法在每次应用DES时,使用不同的密钥,所以有三把独立密钥。这三把密钥组成一起,是一个长度为168(56 + 56 + 56)比特的密钥,所以3DES算法的密钥总长度为168比特。3DES的加密过程,并不是进行三次DES加密(加密→加密→加密),而是以密钥1、密钥2、密钥3的顺序,进行加密→解密→加密的过程。3DES的解密过程和加密正好相反,是以密钥3、密钥2、密钥1的顺序,进行解密→加密→解密的操作。AES算法AES(Advanced Encryption Standard),即高级加密标准,是取代DES算法的一种新的对称加密算法。AES算法是从全世界的企业和密码学家,提交的对称密码算法中竞选出来的,最终 Rijndael 加密算法胜出,所以AES又称为 Rijndael 加密算法。AES也是一种分组密码,它的分组长度为128比特,密钥长度可以为128比特、192比特或256比特。分组密码的模式上面介绍的DES、3DES和AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密更长的明文,就需要对分组密码进行迭代,而分组密码的迭代方法称为分组密码的模式(Model)。简而一句话:分组密码的模式,就是分组密码的迭代方式。分组密码有很多种模式,这里主要介绍以下几种:ECB、CBC、CFB、OFB、CTR。明文分组与密文分组在下面对模式的介绍时,会用到两个术语,这里先介绍一下:在分组密码中,我们称每组的明文为明文分组,每组生成的密文称为密文分组。若将所有的明文分组合并起来就是完整的明文(先忽略填充),将所以的密文分组合并起来就是完整的密文。ECB模式ECB(Electronic CodeBook)模式,即电子密码本模式。该模式是将明文分组,加密后直接成为密文分组,分组之间没有关系。ECB模式是所有模式中最简单的一种,该模式的明文分组与密文分组是一一对应的关系,若明文分组相同,其密文分组也一定相同。因此,ECB模式也是最不安全的模式。CBC模式CBC(Cipher Block Chaining)模式,即密码分组链接模式。该模式首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。只有第一个明文分组特殊,需要提前为其生成一个与分组长度相同的比特序列,进行XOR运算,这个比特序列称为初始化向量(Initialization Vector),简称IV。CFB模式CFB(Cipher FeedBack)模式,即密文反馈模式。该模式首先将前一个密文分组进行加密,再与当前明文分组进行XOR运算,来生成密文分组。同样CFB模式也需要一个IV。OFB模式OFB(Output FeedBack)模式,即输出反馈模式。该模式会产生一个密钥流,即将密码算法的前一个输出值,做为当前密码算法的输入值。该输入值再与明文分组进行XOR运行,计算得出密文分组。该模式需要一个IV,进行加密后做为第一个分组的输入。CTR模式CTR(CounTeR)模式,即计数器模式。该模式也会产生一个密钥流,它通过递增一个计数器来产生连续的密钥流。对该计数器进行加密,再与明文分组进行XOR运算,计算得出密文分组。分组密码的填充在分组密码中,当数据长度不符合分组长度时,需要按一定的方式,将尾部明文分组进行填充,这种将尾部分组数据填满的方法称为填充(Padding)。No Padding即不填充,要求明文的长度,必须是加密算法分组长度的整数倍。... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD DD |ANSI X9.23在填充字节序列中,最后一个字节填充为需要填充的字节长度,其余字节填充0。... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |ISO 10126在填充字节序列中,最后一个字节填充为需要填充的字节长度,其余字节填充随机数。... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |PKCS#5和PKCS#7在填充字节序列中,每个字节填充为需要填充的字节长度。... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |ISO/IEC 7816-4在填充字节序列中,第一个字节填充固定值80,其余字节填充0。若只需填充一个字节,则直接填充80。... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |
... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD 80 |Zero Padding在填充字节序列中,每个字节填充为0。... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |Java代码实现Java在底层已经封装好了对称加密的实现, 我们只需要使用即可。现在介绍几个重要的类:SecureRandom类SecureRandom类是一个强安全的随机数生成器(Random Number Generator,简称:RNG),加密相关的推荐使用此随机数生成器。我们可以通过构造方法生成一个实例,或者向构造方法传递一个种子来创建实例。SecureRandom random = new SecureRandom();KeyGenerator类KeyGenerator类是对称密码的密钥生成器,需要指定加密算法,来生成相应的密钥。Java中支持的算法:AES (128)DES (56)DESede (168)HmacSHA1HmacSHA256下面是一些标准算法的介绍:生成密钥代码如下:/**
* 通过密码和算法获取 Key 对象
*
* @param key 密钥
* @param algorithm 算法,例如:AES (128)、DES (56)、DESede (168)、HmacSHA1、HmacSHA256
* @return 密钥 Key
* @throws Exception
*/
private static Key getKey(byte[] key, String algorithm) throws Exception {// 通过算法获取 KeyGenerator 对象KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);// 使用密钥做为随机数,初始化 KeyGenerator 对象keyGenerator.init(new SecureRandom(key));// 生成 Keyreturn keyGenerator.generateKey();
}Cipher类Cipher类提供了加密和解密的功能。该类需要指定一个转换(Transformation)来创建一个实例,转换的命名方式:算法名称/工作模式/填充方式。下面是Java支持的转换:AES/CBC/NoPadding (128)AES/CBC/PKCS5Padding (128)AES/ECB/NoPadding (128)AES/ECB/PKCS5Padding (128)DES/CBC/NoPadding (56)DES/CBC/PKCS5Padding (56)DES/ECB/NoPadding (56)DES/ECB/PKCS5Padding (56)DESede/CBC/NoPadding (168)DESede/CBC/PKCS5Padding (168)DESede/ECB/NoPadding (168)DESede/ECB/PKCS5Padding (168)RSA/ECB/PKCS1Padding (1024, 2048)RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)下面是一些标准的模式:下面是一些标准的填充:加密代码如下:private static final String DES_ALGORITHM = "DES";
private static final String DES_TRANSFORMATION = "DES/ECB/PKCS5Padding";
/**
* DES 加密
*
* @param data 原始数据
* @param key密钥
* @return 密文
*/
private static byte[] encryptDES(byte[] data, byte[] key) throws Exception {// 获取 DES KeyKey secretKey = getKey(key, DES_ALGORITHM);// 通过标准转换获取 Cipher 对象, 由该对象完成实际的加密操作Cipher cipher = Cipher.getInstance(DES_TRANSFORMATION);// 通过加密模式、密钥,初始化 Cipher 对象cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 生成密文return cipher.doFinal(data);
}解密代码如下:private static final String DES_ALGORITHM = "DES";
private static final String DES_TRANSFORMATION = "DES/ECB/PKCS5Padding";
/**
* DES 解密
*
* @param data 密文
* @param key密钥
* @return 原始数据
*/
private static byte[] decryptDES(byte[] data, byte[] key) throws Exception {// 获取 DES KeyKey secretKey = getKey(key, DES_ALGORITHM);// 通过标准转换获取 Cipher 对象, 由该对象完成实际的加密操作Cipher cipher = Cipher.getInstance(DES_TRANSFORMATION);// 通过解密模式、密钥,初始化 Cipher 对象cipher.init(Cipher.DECRYPT_MODE, secretKey);// 生成原始数据return cipher.doFinal(data);
}完整代码完整代码请访问我的Github,若对你有帮助,欢迎给个⭐,感谢~~ 网络安全成长路线图这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成hei客大神,这个方向越往后,需要学习和掌握的东西就会越来越多,以下是学习网络安全需要走的方向: # 网络安全学习方法 上面介绍了技术分类和学习路线,这里来谈一下学习方法: ## 视频学习 无论你是去B站或者是油管上面都有很多网络安全的相关视频可以学习,当然如果你还不知道选择那套学习,我这里也整理了一套和上述成长路线图挂钩的视频教程,完整版的视频已经上传至CSDN官方,朋友们如果需要可以点击这个链接免费领取。网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!.发布于 2023-02-28 15:51・IP 属地湖南加密技术数据加密网络安全赞同 4添加评论分享喜欢收藏申请
对称加密算法 (DES、3DES、AES、RC) - 清语堂 - 博客园
对称加密算法 (DES、3DES、AES、RC) - 清语堂 - 博客园
会员
周边
新闻
博问
AI培训
云市场
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式 ...
退出登录
注册
登录
清语堂
博客园
首页
新随笔
联系
订阅
管理
对称加密算法 (DES、3DES、AES、RC)
RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从8字节到128字节可变,但目前的实现是8字节(1998年)。 此算法被设计为可容易地在16位的微处理器上实现。在一个IBM AT机上,RC2加密算法的执行可比DES算法快两倍(假设进行密钥扩展)。在C#中用RC2CryptoServiceProvider可以实现此算法。
这篇文章来讲讲对称加密,对称加密在开发中用的很多,如 AES,DES,3DES,RC。
目录:
介绍
优点和缺点
DES算法
3DES算法
AES算法
RC算法
1. 介绍
1.1 概念
采用单钥密码系统的加密方法,同一个密钥用来加密和解密,常见的对称加密算法有 DES,3DES,AES,RC2,RC4,RC5等。
1.2 工作过程
流程看起来很简单,但是发送方和接收方都得保管好密钥,如果密钥被别人知道了,那么数据传输也就不安全了。
2. 优点和缺点
优点:
加密计算量小,速度快,适合对大量数据进行加密的场景。比如前面讲的网络篇 - https协议中的数据是否需要二次加密中就有提到过,证书的传递用的非对称加密,数据传递用的是对称加密。
缺点:
密钥传输问题:如上所说,由于对称加密的加密和解密使用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全的保管,因此加密者如何把密钥安全的传递到解密者手里,就成了对称加密面临的关键问题。(比如,我们客户端肯定不能直接存储对称加密的密钥,因为被反编译之后,密钥就泄露了,数据安全性就得不到保障,所以实际中我们一般都是客户端向服务端请求对称加密的密钥,而且密钥还得用非对称加密加密后再传输)
密钥管理问题:再者随着密钥数量的增多,密钥的管理问题会逐渐显现出来。比如我们在加密用户的信息时,不可能所有用户都用同一个密钥加密解密,这样的话,一旦密钥泄漏,就相当于泄露了所有用户的信息,因此需要为每一个用户单独的生成一个密钥并且管理,这样密钥管理的代价也会非常大。
3. DES算法
DES 全称 Data Encryption Standard,是一种使用密钥加密的块算法。现在认为是一种不安全的加密算法,因为现在已经有用穷举法攻破 DES 密码的报道了。尽管如此,该加密算法还是运用非常普遍,是一种标准的加密算法,3DES 是 DES 的加强版本。
DES 加密算法出自 IBM 的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为 DES 使用56位密钥(密钥长度越长越安全),以现代计算能力24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用 DES 加密算法。
DES 算法的入口参数有三个:Key、Data、Mode。
Key 是 DES 算法的工作密钥。
Data 是要被加密或被解密的数据。
Mode 为 DES 的工作方式,有两种:加密或解密。
private static final String ALGO = "DES";
private static byte[] encrypt(byte[] src, String password) {
try {
// DES 算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂,然后用它把 DESKeySpec 转换成 SecretKey
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGO);
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(ALGO);
// 用密匙初始化 Cipher 对象,ENCRYPT_MODE 用于将 Cipher 初始化为加密模式的常量
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
// 加密数据
return cipher.doFinal(src);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
private static byte[] decrypt(byte[] src, String password) {
try {
// DES 算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个 DESKeySpec 对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGO);
// 将 DESKeySpec 对象转换成 SecretKey 对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher 对象实际完成解密操作
Cipher cipher = Cipher.getInstance(ALGO);
// 用密匙初始化 Cipher 对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 解密数据
return cipher.doFinal(src);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String psw = "12345678";
String data = "hello Test symmetric encry";
byte[] encryData = encrypt(data.getBytes(), psw);
System.out.println("encryData = " + new String(encryData));
byte[] decryData = decrypt(encryData, psw);
System.out.println("decryData = " + new String(decryData));
}
执行输出:
encryData = ��1��z|}�ּ4a&\�[?��0�*P�O�decryData = hello Test symmetric encry
注意,密钥必须是8的倍数,否则会报 java.security.InvalidKeyException: Wrong key size。DES 标准密钥就是56位,8个字符即8个字节,每个字节的最高位不用,即每个字节只用7位,8个字符正好是56位。
4. 3DES算法
3DES(或称为 Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次 DES 加密算法。由于计算机运算能力的增强,原版 DES 密码的密钥长度变得容易被暴力破解;3DES 即是设计用来提供一种相对简单的方法,即通过增加 DES 的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
3DES(即Triple DES)是 DES 向 AES 过渡的加密算法,它使用3条56位的密钥对数据进行三次加密,是 DES 的一个更安全的变形。它以 DES 为基本模块,通过组合分组方法设计出分组加密算法。比起最初的 DES,AES 更为安全。
DES -> 3DES -> AES。
private static final String Algorithm = "DESede";
/**
* 加密数据
*
* @param keybyte keybyte为加密密钥,长度为24字节
* @param src 加密数据源
*/
private static byte[] encrypt(byte[] keybyte, byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
// 加密数据
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
/**
* 解密数据
*
* @param keybyte keybyte为加密密钥,长度为24字节
* @param src 解密数据源
*/
private static byte[] decrypt(byte[] keybyte, byte[] src) {
try {
// 生成密钥
SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
// 解密
return c1.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
e1.printStackTrace();
} catch (javax.crypto.NoSuchPaddingException e2) {
e2.printStackTrace();
} catch (java.lang.Exception e3) {
e3.printStackTrace();
}
return null;
}
public static void main(String[] args) {
// 添加新安全算法,如果用JCE就要把它添加进去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
// 24字节的密钥
final byte[] keyBytes = {
0x11, 0x22, 0x4F, 0x58,
(byte) 0x88, 0x10, 0x40, 0x38,
0x28, 0x25, 0x79, 0x51,
(byte) 0xCB, (byte) 0xDD, 0x55, 0x66,
0x77, 0x29, 0x74, (byte) 0x98,
0x30, 0x40, 0x36, (byte) 0xE2
};
String szSrc = "hello Test symmetric encry";
byte[] encryData = encrypt(keyBytes, szSrc.getBytes());
System.out.println("encryData: " + new String(encryData));
byte[] decryptData = decrypt(keyBytes, encryData);
System.out.println("decryptData: " + (new String(decryptData)));
}
3DES 的密钥长度为24个字节,而 DES 的密钥长度为8的倍数,比如8,16,24都可以。
5. AES算法
上面讲了 DES 加密算法、3DES 加密算法等,但是因为 AES 加密算法的安全性要高于 DES 和 3DES,所以 AES 已经成为了主要的对称加密算法。AES 加密算法就是众多对称加密算法中的一种,它的英文全称是 Advanced Encryption Standard,翻译过来是高级加密标准,它是用来替代之前的 DES 加密算法的。
AES 加密算法采用分组密码体制,每个分组数据的长度为128位16个字节,密钥长度可以是128位16个字节、192位或256位,一共有四种加密模式,我们通常采用需要初始向量 IV 的 CBC 模式,初始向量的长度也是128位16个字节。
AES 加密的五个关键词,分别是:分组密码体制、Padding、密钥、初始向量 IV 和四种加密模式。
5.1 分组密码体制
所谓分组密码体制就是指将明文切成一段一段的来加密,然后再把一段一段的密文拼起来形成最终密文的加密方式。AES 采用分组密码体制,即 AES 加密会首先把明文切成一段一段的,而且每段数据的长度要求必须是128位16个字节,如果最后一段不够16个字节了,就需要用 Padding 来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼起来形成最终的密文。
5.2 Padding
Padding 就是用来把不满16个字节的分组数据填满16个字节用的,它有三种模式 PKCS5、PKCS7 和NOPADDING。PKCS5 是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几,比如缺少5个字节,就在末尾填充5个字节的5。PKCS7 是指分组数据缺少几个字节,就在数据的末尾填充几个字节的0,比如缺少7个字节,就在末尾填充7个字节的0。NoPadding 是指不需要填充,也就是说数据的发送方肯定会保证最后一段数据也正好是16个字节。那如果在PKCS5 模式下,最后一段数据的内容刚好就是16个16怎么办?那解密端就不知道这一段数据到底是有效数据还是填充数据了,因此对于这种情况,PKCS5 模式会自动帮我们在最后一段数据后再添加16个字节的数据,而且填充数据也是16个16,这样解密段就能知道谁是有效数据谁是填充数据了。PKCS7 最后一段数据的内容是16个0,也是同样的道理。解密端需要使用和加密端同样的 Padding 模式,才能准确的识别有效数据和填充数据。我们开发通常采用 PKCS7 Padding 模式。
5.3 初始向量IV
初始向量 IV 的作用是使加密更加安全可靠,我们使用 AES 加密时需要主动提供初始向量,而且只需要提供一个初始向量就够了,后面每段数据的加密向量都是前面一段的密文。初始向量 IV 的长度规定为128位16个字节,初始向量的来源为随机生成。至于为什么初始向量能使加密更安全可靠,会在下面的加密模式中提到。
5.4 密钥
AES 要求密钥的长度可以是128位16个字节、192位或者256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些,因此要做好衡量。我们开发通常采用128位16个字节的密钥,我们使用 AES 加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成(我们开发时传入的那个为初始密钥,除了初始密钥以外,后面每一轮的密钥都是由上一轮的密钥扩展而来的,密钥扩展有四个步骤:排列、置换、与轮常量异或、生成下一轮密钥的其他列)。
5.5 四种加密模式
AES 一共有四种加密模式,分别是 ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB、OFB,我们一般使用的是 CBC 模式。四种模式中除了 ECB 相对不安全之外,其它三种模式的区别并没有那么大(ECB 模式是最基本的加密模式,即仅仅使用明文和密钥来加密数据,相同的明文块会被加密成相同的密文块,这样明文和密文的结构将是完全一样的,就会更容易被破解,相对来说不是那么安全,因此很少使用,而 CBC 模式则比 ECB 模式多了一个初始向量 IV,加密的时候,第一个明文块会首先和初始向量 IV 做异或操作,然后再经过密钥加密,然后第一个密文块又会作为第二个明文块的加密向量来异或,依次类推下去,这样相同的明文块加密出的密文块就是不同的,明文的结构和密文的结构也将是不同的,因此更加安全,我们常用的就是 CBC 加密模式)。
AES 流程图:
private static final String ALGO = "AES/ECB/PKCS5Padding";
public static byte[] encrypt(String data, Key key) {
try {
Cipher cipher = Cipher.getInstance(ALGO);
cipher.init(cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data.getBytes());
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
private static byte[] decrypt(byte[] result, Key key) {
try {
Cipher cipher = Cipher.getInstance(ALGO);
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(result);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return null;
}
private static Key createKey() {
try {
// 生成key
KeyGenerator keyGenerator;
// 构造密钥生成器,指定为AES算法,不区分大小写
keyGenerator = KeyGenerator.getInstance("AES");
// 生成一个128位的随机源,根据传入的字节数组
keyGenerator.init(128);
// 产生原始对称密钥
SecretKey secretKey = keyGenerator.generateKey();
// 获得原始对称密钥的字节数组
byte[] keyBytes = secretKey.getEncoded();
// key转换,根据字节数组生成AES密钥
return new SecretKeySpec(keyBytes, "AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String data = "hello Test symmetric encry";
Key key = createKey();
byte[] encryData = encrypt(data, key);
System.out.println("encryData = " + new String(encryData));
byte[] decryData = decrypt(encryData, key);
System.out.println("decryData = " + new String(decryData));
}
执行输出:
encryData = ,A��8�dZ�|o��Wʏ�i"���K�decryData = hello Test symmetric encry
6. RC算法
包括RC2,RC4,RC5。
RC2 是由著名密码学家 Ron Rivest 设计的一种传统对称分组加密算法,它可作为 DES 算法的建议替代算法。它的输入和输出都是64bit。密钥的长度是从1字节到128字节可变,但目前的实现是8字节(1998年)。
RC4 于1987年提出,和 DES 算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于 DES的是,RC4 不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。
RC4 算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048bit),在如今技术支持的前提下,当密钥长度为128bit时,用暴力法搜索密钥已经不太可行,所以可以预见 RC4 的密钥范围任然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的 RC4 加密算法的有效攻击方法。
RC5 分组密码算法是1994由麻萨诸塞技术研究所的 Ronald L. Rivest 教授发明的,并由 RSA 实验室分析。它是参数可变的分组密码算法,三个可变的参数是:分组大小、密钥大小和加密轮数。在此算法中使用了三种运算:异或、加和循环。
来看一个 RC4 的例子:
package io.kzw.advance.csdn_blog;
public class RC4 {
public static String decry_RC4(byte[] data, String key) {
if (data == null || key == null) {
return null;
}
return asString(RC4Base(data, key));
}
public static String decry_RC4(String data, String key) {
if (data == null || key == null) {
return null;
}
return new String(RC4Base(HexString2Bytes(data), key));
}
public static byte[] encry_RC4_byte(String data, String key) {
if (data == null || key == null) {
return null;
}
byte b_data[] = data.getBytes();
return RC4Base(b_data, key);
}
public static String encry_RC4_string(String data, String key) {
if (data == null || key == null) {
return null;
}
return toHexString(asString(encry_RC4_byte(data, key)));
}
private static String asString(byte[] buf) {
StringBuffer strbuf = new StringBuffer(buf.length);
for (int i = 0; i < buf.length; i++) {
strbuf.append((char) buf[i]);
}
return strbuf.toString();
}
private static byte[] initKey(String aKey) {
byte[] b_key = aKey.getBytes();
byte state[] = new byte[256];
for (int i = 0; i < 256; i++) {
state[i] = (byte) i;
}
int index1 = 0;
int index2 = 0;
if (b_key == null || b_key.length == 0) {
return null;
}
for (int i = 0; i < 256; i++) {
index2 = ((b_key[index1] & 0xff) + (state[i] & 0xff) + index2) & 0xff;
byte tmp = state[i];
state[i] = state[index2];
state[index2] = tmp;
index1 = (index1 + 1) % b_key.length;
}
return state;
}
private static String toHexString(String s) {
String str = "";
for (int i = 0; i < s.length(); i++) {
int ch = (int) s.charAt(i);
String s4 = Integer.toHexString(ch & 0xFF);
if (s4.length() == 1) {
s4 = '0' + s4;
}
str = str + s4;
}
// 0x表示十六进制
return str;
}
private static byte[] HexString2Bytes(String src) {
int size = src.length();
byte[] ret = new byte[size / 2];
byte[] tmp = src.getBytes();
for (int i = 0; i < size / 2; i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
private static byte uniteBytes(byte src0, byte src1) {
char _b0 = (char) Byte.decode("0x" + new String(new byte[]{src0}))
.byteValue();
_b0 = (char) (_b0 << 4);
char _b1 = (char) Byte.decode("0x" + new String(new byte[]{src1}))
.byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
private static byte[] RC4Base(byte[] input, String mKkey) {
int x = 0;
int y = 0;
// 这边将密钥确保为 256 个字节
byte key[] = initKey(mKkey);
int xorIndex;
byte[] result = new byte[input.length];
for (int i = 0; i < input.length; i++) {
x = (x + 1) & 0xff;
y = ((key[x] & 0xff) + y) & 0xff;
byte tmp = key[x];
key[x] = key[y];
key[y] = tmp;
xorIndex = ((key[x] & 0xff) + (key[y] & 0xff)) & 0xff;
result[i] = (byte) (input[i] ^ key[xorIndex]);
}
return result;
}
}
执行输出:
,5�n��z�z��> ��A��T� �?decryData = hello Test symmetric
posted @
2021-01-19 08:29
清语堂
阅读(15820)
评论(0)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面返回顶部
公告
Copyright © 2024 清语堂
Powered by .NET 8.0 on Kubernetes
对称加密算法 - 廖雪峰的官方网站
对称加密算法 - 廖雪峰的官方网站
Index
廖雪峰的官方网站
Blog
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
More
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
Profile
Passkey
Sign Out
Sign In
English
简体中文
Index
Java教程
Java快速入门
Java简介
安装JDK
第一个Java程序
Java代码助手
使用IDE
使用IDE练习插件
Java程序基础
Java程序基本结构
变量和数据类型
整数运算
浮点数运算
布尔运算
字符和字符串
数组类型
流程控制
输入和输出
if判断
switch多重选择
while循环
do while循环
for循环
break和continue
数组操作
遍历数组
数组排序
多维数组
命令行参数
面向对象编程
面向对象基础
方法
构造方法
方法重载
继承
多态
抽象类
接口
静态字段和静态方法
包
作用域
内部类
classpath和jar
class版本
模块
Java核心类
字符串和编码
StringBuilder
StringJoiner
包装类型
JavaBean
枚举类
记录类
BigInteger
BigDecimal
常用工具类
异常处理
Java的异常
捕获异常
抛出异常
自定义异常
NullPointerException
使用断言
使用JDK Logging
使用Commons Logging
使用Log4j
使用SLF4J和Logback
反射
Class类
访问字段
调用方法
调用构造方法
获取继承关系
动态代理
注解
使用注解
定义注解
处理注解
泛型
什么是泛型
使用泛型
编写泛型
擦拭法
extends通配符
super通配符
泛型和反射
集合
Java集合简介
使用List
编写equals方法
使用Map
编写equals和hashCode
使用EnumMap
使用TreeMap
使用Properties
使用Set
使用Queue
使用PriorityQueue
使用Deque
使用Stack
使用Iterator
使用Collections
IO
File对象
InputStream
OutputStream
Filter模式
操作Zip
读取classpath资源
序列化
Reader
Writer
PrintStream和PrintWriter
使用Files
日期与时间
基本概念
Date和Calendar
LocalDateTime
ZonedDateTime
DateTimeFormatter
Instant
最佳实践
单元测试
编写JUnit测试
使用Fixture
异常测试
条件测试
参数化测试
正则表达式
正则表达式简介
匹配规则
复杂匹配规则
分组匹配
非贪婪匹配
搜索和替换
加密与安全
编码算法
哈希算法
BouncyCastle
Hmac算法
对称加密算法
口令加密算法
密钥交换算法
非对称加密算法
签名算法
数字证书
多线程
多线程基础
创建新线程
线程的状态
中断线程
守护线程
线程同步
同步方法
死锁
使用wait和notify
使用ReentrantLock
使用Condition
使用ReadWriteLock
使用StampedLock
使用Semaphore
使用Concurrent集合
使用Atomic
使用线程池
使用Future
使用CompletableFuture
使用ForkJoin
使用ThreadLocal
使用虚拟线程
Maven基础
Maven介绍
依赖管理
构建流程
使用插件
模块管理
使用mvnw
发布Artifact
网络编程
网络编程基础
TCP编程
UDP编程
发送Email
接收Email
HTTP编程
RMI远程调用
XML与JSON
XML简介
使用DOM
使用SAX
使用Jackson
使用JSON
JDBC编程
JDBC简介
JDBC查询
JDBC更新
JDBC事务
JDBC Batch
JDBC连接池
函数式编程
Lambda基础
方法引用
使用Stream
创建Stream
使用map
使用filter
使用reduce
输出集合
其他操作
设计模式
创建型模式
工厂方法
抽象工厂
生成器
原型
单例
结构型模式
适配器
桥接
组合
装饰器
外观
享元
代理
行为型模式
责任链
命令
解释器
迭代器
中介
备忘录
观察者
状态
策略
模板方法
访问者
Web开发
Web基础
Servlet入门
Servlet开发
Servlet进阶
重定向与转发
使用Session和Cookie
JSP开发
MVC开发
MVC高级开发
使用Filter
修改请求
修改响应
使用Listener
部署
Spring开发
IoC容器
IoC原理
装配Bean
使用Annotation配置
定制Bean
使用Resource
注入配置
使用条件装配
使用AOP
装配AOP
使用注解装配AOP
AOP避坑指南
访问数据库
使用JDBC
使用声明式事务
使用DAO
集成Hibernate
集成JPA
集成MyBatis
设计ORM
开发Web应用
使用Spring MVC
使用REST
集成Filter
使用Interceptor
处理CORS
国际化
异步处理
使用WebSocket
集成第三方组件
集成JavaMail
集成JMS
使用Scheduler
集成JMX
Spring Boot开发
第一个Spring Boot应用
使用开发者工具
打包Spring Boot应用
瘦身Spring Boot应用
使用Actuator
使用Profiles
使用Conditional
加载配置文件
禁用自动配置
添加Filter
集成第三方组件
集成Open API
访问Redis
集成Artemis
集成RabbitMQ
集成Kafka
Spring Cloud开发
项目架构设计
搭建项目框架
设计交易引擎
设计资产系统
设计订单系统
设计撮合引擎
设计清算系统
完成交易引擎
设计定序系统
设计API系统
设计行情系统
设计推送系统
编写UI
项目总结
关注公众号不定期领红包:
加入知识星球社群:
关注微博获取实时动态:
对称加密算法
Last updated: ...
/
Reads: 1333606
Edit
对称加密算法就是传统的用一个密码进行加密和解密。例如,我们常用的WinZIP和WinRAR对压缩包的加密和解密,就是使用对称加密算法:
从程序的角度看,所谓加密,就是这样一个函数,它接收密码和明文,然后输出密文:
secret = encrypt(key, message);
而解密则相反,它接收密码和密文,然后输出明文:
plain = decrypt(key, secret);
在软件开发中,常用的对称加密算法有:
算法密钥长度工作模式填充模式
DES56/64ECB/CBC/PCBC/CTR/...NoPadding/PKCS5Padding/...
AES128/192/256ECB/CBC/PCBC/CTR/...NoPadding/PKCS5Padding/PKCS7Padding/...
IDEA128ECBPKCS5Padding/PKCS7Padding/...
密钥长度直接决定加密强度,而工作模式和填充模式可以看成是对称加密算法的参数和格式选择。Java标准库提供的算法实现并不包括所有的工作模式和所有填充模式,但是通常我们只需要挑选常用的使用就可以了。
最后注意,DES算法由于密钥过短,可以在短时间内被暴力破解,所以现在已经不安全了。
使用AES加密
AES算法是目前应用最广泛的加密算法。我们先用ECB模式加密并解密:
import java.security.*;
import java.util.Base64;
import javax.crypto.*;
import javax.crypto.spec.*;
public class Main {
public static void main(String[] args) throws Exception {
// 原文:
String message = "Hello, world!";
System.out.println("Message: " + message);
// 128位密钥 = 16 bytes Key:
byte[] key = "1234567890abcdef".getBytes("UTF-8");
// 加密:
byte[] data = message.getBytes("UTF-8");
byte[] encrypted = encrypt(key, data);
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));
// 解密:
byte[] decrypted = decrypt(key, encrypted);
System.out.println("Decrypted: " + new String(decrypted, "UTF-8"));
}
// 加密:
public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKey keySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
return cipher.doFinal(input);
}
// 解密:
public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKey keySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
return cipher.doFinal(input);
}
}
Java标准库提供的对称加密接口非常简单,使用时按以下步骤编写代码:
根据算法名称/工作模式/填充模式获取Cipher实例;
根据算法名称初始化一个SecretKey实例,密钥必须是指定长度;
使用SecretKey初始化Cipher实例,并设置加密或解密模式;
传入明文或密文,获得密文或明文。
ECB模式是最简单的AES加密模式,它只需要一个固定长度的密钥,固定的明文会生成固定的密文,这种一对一的加密方式会导致安全性降低,更好的方式是通过CBC模式,它需要一个随机数作为IV参数,这样对于同一份明文,每次生成的密文都不同:
import java.security.*;
import java.util.Base64;
import javax.crypto.*;
import javax.crypto.spec.*;
----
public class Main {
public static void main(String[] args) throws Exception {
// 原文:
String message = "Hello, world!";
System.out.println("Message: " + message);
// 256位密钥 = 32 bytes Key:
byte[] key = "1234567890abcdef1234567890abcdef".getBytes("UTF-8");
// 加密:
byte[] data = message.getBytes("UTF-8");
byte[] encrypted = encrypt(key, data);
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));
// 解密:
byte[] decrypted = decrypt(key, encrypted);
System.out.println("Decrypted: " + new String(decrypted, "UTF-8"));
}
// 加密:
public static byte[] encrypt(byte[] key, byte[] input) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
// CBC模式需要生成一个16 bytes的initialization vector:
SecureRandom sr = SecureRandom.getInstanceStrong();
byte[] iv = sr.generateSeed(16);
IvParameterSpec ivps = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps);
byte[] data = cipher.doFinal(input);
// IV不需要保密,把IV和密文一起返回:
return join(iv, data);
}
// 解密:
public static byte[] decrypt(byte[] key, byte[] input) throws GeneralSecurityException {
// 把input分割成IV和密文:
byte[] iv = new byte[16];
byte[] data = new byte[input.length - 16];
System.arraycopy(input, 0, iv, 0, 16);
System.arraycopy(input, 16, data, 0, data.length);
// 解密:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivps = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivps);
return cipher.doFinal(data);
}
public static byte[] join(byte[] bs1, byte[] bs2) {
byte[] r = new byte[bs1.length + bs2.length];
System.arraycopy(bs1, 0, r, 0, bs1.length);
System.arraycopy(bs2, 0, r, bs1.length, bs2.length);
return r;
}
}
在CBC模式下,需要一个随机生成的16字节IV参数,必须使用SecureRandom生成。因为多了一个IvParameterSpec实例,因此,初始化方法需要调用Cipher的一个重载方法并传入IvParameterSpec。
观察输出,可以发现每次生成的IV不同,密文也不同。
小结
对称加密算法使用同一个密钥进行加密和解密,常用算法有DES、AES和IDEA等;
密钥长度由算法设计决定,AES的密钥长度是128/192/256位;
使用对称加密算法需要指定算法名称、工作模式和填充模式。
Comments
Make a comment
Sign in to
make a comment
Index
Java教程
Java快速入门
Java简介
安装JDK
第一个Java程序
Java代码助手
使用IDE
使用IDE练习插件
Java程序基础
Java程序基本结构
变量和数据类型
整数运算
浮点数运算
布尔运算
字符和字符串
数组类型
流程控制
输入和输出
if判断
switch多重选择
while循环
do while循环
for循环
break和continue
数组操作
遍历数组
数组排序
多维数组
命令行参数
面向对象编程
面向对象基础
方法
构造方法
方法重载
继承
多态
抽象类
接口
静态字段和静态方法
包
作用域
内部类
classpath和jar
class版本
模块
Java核心类
字符串和编码
StringBuilder
StringJoiner
包装类型
JavaBean
枚举类
记录类
BigInteger
BigDecimal
常用工具类
异常处理
Java的异常
捕获异常
抛出异常
自定义异常
NullPointerException
使用断言
使用JDK Logging
使用Commons Logging
使用Log4j
使用SLF4J和Logback
反射
Class类
访问字段
调用方法
调用构造方法
获取继承关系
动态代理
注解
使用注解
定义注解
处理注解
泛型
什么是泛型
使用泛型
编写泛型
擦拭法
extends通配符
super通配符
泛型和反射
集合
Java集合简介
使用List
编写equals方法
使用Map
编写equals和hashCode
使用EnumMap
使用TreeMap
使用Properties
使用Set
使用Queue
使用PriorityQueue
使用Deque
使用Stack
使用Iterator
使用Collections
IO
File对象
InputStream
OutputStream
Filter模式
操作Zip
读取classpath资源
序列化
Reader
Writer
PrintStream和PrintWriter
使用Files
日期与时间
基本概念
Date和Calendar
LocalDateTime
ZonedDateTime
DateTimeFormatter
Instant
最佳实践
单元测试
编写JUnit测试
使用Fixture
异常测试
条件测试
参数化测试
正则表达式
正则表达式简介
匹配规则
复杂匹配规则
分组匹配
非贪婪匹配
搜索和替换
加密与安全
编码算法
哈希算法
BouncyCastle
Hmac算法
对称加密算法
口令加密算法
密钥交换算法
非对称加密算法
签名算法
数字证书
多线程
多线程基础
创建新线程
线程的状态
中断线程
守护线程
线程同步
同步方法
死锁
使用wait和notify
使用ReentrantLock
使用Condition
使用ReadWriteLock
使用StampedLock
使用Semaphore
使用Concurrent集合
使用Atomic
使用线程池
使用Future
使用CompletableFuture
使用ForkJoin
使用ThreadLocal
使用虚拟线程
Maven基础
Maven介绍
依赖管理
构建流程
使用插件
模块管理
使用mvnw
发布Artifact
网络编程
网络编程基础
TCP编程
UDP编程
发送Email
接收Email
HTTP编程
RMI远程调用
XML与JSON
XML简介
使用DOM
使用SAX
使用Jackson
使用JSON
JDBC编程
JDBC简介
JDBC查询
JDBC更新
JDBC事务
JDBC Batch
JDBC连接池
函数式编程
Lambda基础
方法引用
使用Stream
创建Stream
使用map
使用filter
使用reduce
输出集合
其他操作
设计模式
创建型模式
工厂方法
抽象工厂
生成器
原型
单例
结构型模式
适配器
桥接
组合
装饰器
外观
享元
代理
行为型模式
责任链
命令
解释器
迭代器
中介
备忘录
观察者
状态
策略
模板方法
访问者
Web开发
Web基础
Servlet入门
Servlet开发
Servlet进阶
重定向与转发
使用Session和Cookie
JSP开发
MVC开发
MVC高级开发
使用Filter
修改请求
修改响应
使用Listener
部署
Spring开发
IoC容器
IoC原理
装配Bean
使用Annotation配置
定制Bean
使用Resource
注入配置
使用条件装配
使用AOP
装配AOP
使用注解装配AOP
AOP避坑指南
访问数据库
使用JDBC
使用声明式事务
使用DAO
集成Hibernate
集成JPA
集成MyBatis
设计ORM
开发Web应用
使用Spring MVC
使用REST
集成Filter
使用Interceptor
处理CORS
国际化
异步处理
使用WebSocket
集成第三方组件
集成JavaMail
集成JMS
使用Scheduler
集成JMX
Spring Boot开发
第一个Spring Boot应用
使用开发者工具
打包Spring Boot应用
瘦身Spring Boot应用
使用Actuator
使用Profiles
使用Conditional
加载配置文件
禁用自动配置
添加Filter
集成第三方组件
集成Open API
访问Redis
集成Artemis
集成RabbitMQ
集成Kafka
Spring Cloud开发
项目架构设计
搭建项目框架
设计交易引擎
设计资产系统
设计订单系统
设计撮合引擎
设计清算系统
完成交易引擎
设计定序系统
设计API系统
设计行情系统
设计推送系统
编写UI
项目总结
廖雪峰的官方网站
©Copyright 2019-2021
Powered by iTranswarp
Feedback
License
对称加密_百度百科
_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心对称加密播报讨论上传视频密码加密方法收藏查看我的收藏0有用+10本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。中文名对称加密外文名symmetrical encryption别 名单密钥加密领 域信息科学定 义采用单钥密码系统的加密方法用 途信息的加密和解密目录1定义2工作过程3常用算法4算法5优缺点定义播报编辑需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。所谓对称,就是采用这种加密方法的双方,使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。因此加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。 [1]工作过程播报编辑下面举个例子来简要说明一下对称加密的工作过程。甲和乙是一对生意搭档,他们住在不同的城市。由于生意上的需要,他们经常会相互之间邮寄重要的货物。为了保证货物的安全,他们商定制作一个保险盒,将物品放入其中。他们打造了两把相同的钥匙分别保管,以便在收到包裹时用这个钥匙打开保险盒,以及在邮寄货物前用这把钥匙锁上保险盒。上面是一个将重要资源安全传递到目的地的传统方式,只要甲乙小心保管好钥匙,那么就算有人得到保险盒,也无法打开。这个思想被用到了现代计算机通信的信息加密中。在对称加密中,数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密。 [2]对称加密工作过程简要示意图常用算法播报编辑在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。不同算法的实现机制不同,可参考对应算法的详细资料。算法播报编辑采用单钥密码的加密方法,同一个密钥可以同时用来加密和解密,这种加密方法称为对称加密,也称为单密钥加密。常用的单向加密算法:1、DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;2、3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;3、AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256位密钥的加密;4、Blowfish算法特征1、加密方和解密方使用同一个密钥;2、加密解密的速度比较快,适合数据比较长时的使用;3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦;加密工具1、openssl,它使用了libcrypto加密库、libssl库即TLS/SSL协议的实现库等。TLS/SSL是基于会话的、实现了身份认证、数据机密性和会话完整性的TLS/SSL库。openssl官网。2、gpg [3]优缺点播报编辑对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的独一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000对称加密算法_百度百科
算法_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心对称加密算法播报讨论上传视频加密算法收藏查看我的收藏0有用+10对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yao)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。中文名对称加密算法外文名symmetric encryption algorithm实 质加密算法特 点技术成熟处理对象明文和加密密钥目录1简介2特点3具体算法4应用模式简介播报编辑对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。特点播报编辑对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。而与公开密钥加密算法比起来,对称加密算法能够提供加密和认证却缺乏了签名功能,使得使用范围有所缩小。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起。具体算法播报编辑主要有DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法。这里进行简单介绍一下基于“对称密钥”的加密算法。基于“对称密钥”的加密算法主要有DES、TripleDES、RC2、RC4、RC5和Blowfish等。对称密钥:DES TripleDES算法DES算法把64位的明文输入块变为数据长度为64位的密文输出块,其中8位为奇偶校验位,另外56位作为密码的长度。首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换,最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。DES算法具有极高的安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法,而56位长密钥的穷举空间为2^56,这意味着如果一台计算机的速度是每秒种检测100万个密钥,那么它搜索完全部密钥就需要将近2285年的时间,因此DES算法是一种很可靠的加密方法。对称密钥:RC算法RC4算法的原理是“搅乱”,它包括初始化算法和伪随机子密码生成算法两大部分,在初始化的过程中,密钥的主要功能是将一个256字节的初始数簇进行随机搅乱,不同的数簇在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将得到的子密钥序列和明文进行异或运算(XOR)后,得到密文。由于RC4算法加密采用的是异或方式,所以,一旦子密钥序列出现了重复,密文就有可能被破解,但是目前还没有发现密钥长度达到128位的RC4有重复的可能性,所以,RC4也是目前最安全的加密算法之一。对称密钥:BlowFish算法 [1]BlowFish算法是一个64位分组及可变密钥长度的分组密码算法,该算法是非专利的。BlowFish算法使用两个“盒”:pbox[18]和sbox[4256],BlowFish算法有一个核心加密函数。该函数输入64位信息,运算后以64位密文的形式输出。用BlowFish算法加密信息,需要密钥预处理和信息加密两个过程。BlowFish算法的原密钥pbox和sbox是固定的,要加密一个信息,需要选择一个key,用这个key对pbox和sbox进行变换,得到下一步信息加密所用到的key_pbox和key_sbox。BlowFish算法解密,同样也需要密钥预处理和信息解密两个过程。密钥预处理的过程和加密时完全相同。信息解密的过程就是把信息加密过程的key_pbox逆序使用即可。应用模式播报编辑加密模式(英文名称及简写)中文名称Electronic Code Book(ECB)电子密码本模式Cipher Block Chaining(CBC)密码分组链接模式Cipher Feedback Mode(CFB)加密反馈模式Output Feedback Mode(OFB)输出反馈模式ECB:最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。CFB:类似于自同步序列密码,分组加密后,按8位分组将密文和明文进行移位异或后得到输出同时反馈回移位寄存器,优点最小可以按字节进行加解密,也可以是n位的,CFB也是上下文相关的,CFB模式下,明文的一个错误会影响后面的密文(错误扩散)。OFB:将分组密码作为同步序列密码运行,和CFB相似,不过OFB用的是前一个n位密文输出分组反馈回移位寄存器,OFB没有错误扩散问题。新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000【加密算法】AES对称加密算法简介-CSDN博客
>【加密算法】AES对称加密算法简介-CSDN博客
【加密算法】AES对称加密算法简介
最新推荐文章于 2024-03-05 23:05:38 发布
季风泯灭的季节
最新推荐文章于 2024-03-05 23:05:38 发布
阅读量1.9k
收藏
22
点赞数
28
分类专栏:
加密算法
文章标签:
java
AES
对称加密
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lmj3732018/article/details/136314088
版权
加密算法
专栏收录该内容
5 篇文章
0 订阅
订阅专栏
目录
前言
工作原理
SubBytes
ShiftRows
MixColumns
AddRoundKey
应用场景
在Java中使用AES
加密和解密数据
注意事项和最佳实践
结论
前言
AES(Advanced Encryption Standard)是一种对称加密算法,它在密码学中被广泛应用。AES取代了原先的DES(Data Encryption Standard),成为新一代的加密标准。AES算法使用相同的密钥来进行加密和解密,因此被称为对称加密算法。它采用了替代和混淆的技术,通过对输入数据进行一系列的变换和代换,最终得到加密后的输出。
工作原理
SubBytes
在SubBytes阶段,AES算法使用一个固定的S盒(Substitution Box),将输入的每一个字节替换成另一个字节。S盒中的每一个字节都经过了一系列的代换和混淆操作,使得替换后的输出具有非线性和随机性。
ShiftRows
ShiftRows阶段对输入的状态矩阵进行行移位操作。每一行都向左移动不同的位数,这样可以增加算法的混淆度,使得密文更加难以分析和破解。
MixColumns
MixColumns阶段对状态矩阵中的列进行混淆操作。这个步骤涉及到一系列的线性变换,使得输入数据更加分散和随机,增加了算法的安全性。
AddRoundKey
AddRoundKey阶段将轮密钥和当前状态矩阵进行按位异或操作。每一轮的轮密钥都是从主密钥中生成的,通过对轮密钥和状态矩阵进行异或操作,实现了密钥的混淆和扩散。
应用场景
AES算法在各个领域都有广泛的应用,包括但不限于:
数据加密: AES被广泛应用于保护敏感数据的加密,如个人信息、银行数据、密码等。网络通信: 在网络通信中,AES用于加密数据传输,保护通信内容不被窃听或篡改。存储加密: AES可以用于对存储在磁盘或数据库中的数据进行加密,以防止未经授权的访问。
在Java中使用AES
加密和解密数据
在Java中,可以使用Cipher类来执行AES加密和解密操作。以下是一个简单的示例代码:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESEncryption {
public static void main(String[] args) throws Exception {
String originalText = "Hello, AES!";
String key = "0123456789abcdef"; // 密钥长度必须为16字节(128位)、24字节(192位)或32字节(256位)
// 加密数据
byte[] encryptedBytes = encrypt(originalText, key);
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encryptedBytes));
// 解密数据
String decryptedText = decrypt(encryptedBytes, key);
System.out.println("Decrypted: " + decryptedText);
}
// 加密方法
private static byte[] encrypt(String originalText, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinal(originalText.getBytes());
}
// 解密方法
private static String decrypt(byte[] encryptedBytes, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes);
}
}
注意事项和最佳实践
密钥安全: 密钥的安全性对于保护加密数据至关重要。确保密钥的安全存储和管理,避免在不安全的环境中存储密钥。填充方式: AES算法通常需要指定填充方式。常用的填充方式包括PKCS5Padding和NoPadding。确保在加密和解密时使用相同的填充方式。初始化向量: 在某些模式下,如CBC模式,需要使用初始化向量(IV)来增加加密的随机性。确保在加密时使用随机生成的IV,并在解密时正确地传递IV。
结论
AES算法是一种高效且安全的对称加密算法,在Java中易于使用。通过使用Cipher类进行加密和解密操作,并注意密钥的安全性和填充方式,可以确保数据的安全传输和存储。
优惠劵
季风泯灭的季节
关注
关注
28
点赞
踩
22
收藏
觉得还不错?
一键收藏
打赏
知道了
21
评论
【加密算法】AES对称加密算法简介
AES(Advanced Encryption Standard)是一种对称加密算法,它在密码学中被广泛应用。AES取代了原先的DES(Data Encryption Standard),成为新一代的加密标准。AES算法使用相同的密钥来进行加密和解密,因此被称为对称加密算法。它采用了替代和混淆的技术,通过对输入数据进行一系列的变换和代换,最终得到加密后的输出。
复制链接
扫一扫
专栏目录
python实现对称加密中AES算法工程文件
07-09
python实现对称加密中AES算法工程文件
详解博客地址:https://blog.csdn.net/m0_52316372/article/details/125697279
Java实现的对称加密算法AES定义与用法详解
08-27
主要介绍了Java实现的对称加密算法AES,结合实例形式分析了对称加密算法AES的定义、特点、用法及使用场景,需要的朋友可以参考下
21 条评论
您还未登录,请先
登录
后发表或查看评论
AES对称加密算法-C语言
11-22
C语言实现AES-128对称加解密算法。编译环境:VS2010。请参考我的博客https://blog.csdn.net/u013073067/article/details/86529111 分析代码
Java AES对称加密解密算法
03-02
Java AES对称加密解密算法
AES/DES 对称加密算法
12-25
DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.
加密算法之对称加密(AES加密) 及在jdk中应用
热门推荐
踩踩踩从踩的博客
09-01
1万+
加密算法之安全hash算法、RSA非对称加密算法分析
前言
之前分析过加密算法中hash算法和非对称加密算法(RSA)包括费马小定理和欧拉函数推导了一下,对加密算法有个大概的理解,素数的应用,继续分析一下对称加密算法,并且在jdk中的应用。
AES概念
AES算法又叫高级加密标准,
...
Java实现对称加密算法-AES加解密
Never Limit
12-07
1222
AES(Advanced Encryption Standard)意思是高级加密标准,是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
那么为什么原来的DES会被取代呢,原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。
完善的加密算法在理论上是无法破解的,除非使用穷尽法。使用穷尽法破解密钥长度在128位以上的加密数据是不现实的,仅存在理论上的可能性。统计显示,即使使用目前.
AES 对称加密算法
解决bug的路上
05-11
3914
AES 加减密
对称加密算法与非对称加密算法
qq_59616295的博客
07-21
2065
对称加密算法与非对称加密算法,以及它们之间的区别
Java自学day4
nanshenchao的博客
03-03
1236
数字进行运算时,数据类型不一样不能运算,需要一样的,才能运算。类型转换的分类:1.隐式转换(自动类型提升):取值范围小的数值转向取值范围大的数值2.强制转换:取值范围大的数值转向取值范围小的数值如果把一个取值范围大的数值,赋值给取值范围小的变量。是不允许直接赋值的。如果一定要这么做就需要加入强制转换格式:目标数据类型 变量名 = (目标数据类型)被强转的数据;
重学SpringBoot3-yaml文件配置
CoderJia的学习之路
03-05
902
YAML 提供了一种更为人性化的配置文件格式,它通过简洁的结构化格式,使得配置信息更加易于理解和维护。在 Spring Boot 中,通过使用 YAML,开发者可以轻松地管理和切换不同环境下的配置,优化开发流程。掌握 YAML 的基本写法和在 Spring Boot 中的应用,将有助于提高你的开发效率。
LeetCode hot100-4
alike_meng的博客
03-04
502
LeetCode热题100第4题
android开发教程视频,android组件化和插件化
m0_60667384的博客
03-05
475
rver文件检测,IDA调试端口检测;
Java集合5-HashSet
最新发布
wujianyouhun的专栏
03-05
368
HashSet的原理比较简单,几乎全部借助于HashMap来实现的。由于 HashSet 的底层是基于 HashMap 实现的,因此具有 HashMap 的特性,如高效的添加、查找操作(平均情况下为 O(1)),去重功能等。不过需要注意的是,HashSet 并不保证元素的顺序,元素存储的顺序与插入顺序可能不同,因为它是根据哈希值存储的。所以HashMap会出现的问题HashSet依然不能避免。
面试 Java 基础八股文十问十答第十五期
qq_67358181的博客
03-05
971
面试必备八股文!内容包含:Java基础、Java框架、Git命令、JVM、多线程、消息队列、微服务、Linux、数据库、Redis缓存、算法、Vue、React、前端性能优化等八股文。
类加载器(Class Loader)与双亲委派模型(Parent Delegation Model)
小湘西的博客
03-01
853
类加载器是Java中用于加载类文件(.class 文件)到Java虚拟机(JVM)中的一部分。它负责将类的字节码转换成Java虚拟机能理解的Class对象。类加载器在Java程序运行期间,负责动态加载、链接和初始化类。
java-初级项目实战-(swing篇)-羊了个羊(动态交互,)
qq_61549190的博客
03-04
489
判断t方格是否压住b方格,就要保证t方格的左上的黑点始终在蓝框内。即t的 x坐标(x1,x2)之间,y(y1,y2)之间。将下方图片添加到一个盒子中(简单的添加)添加一个新的集合,用于存储下方的图片。蓝框为b方格的宽度和高度的2倍,x1的x即为b的左上点x-其宽度。y1的y即为b的左上点y-其高度。y2的y即为b的左上点y+其高度。x2的x即为b左上点x+其宽度。t方格的黑点设置为(x,y)先检测2张牌是否压住。
Java并发编程-进程和线程
q1372302825的博客
03-05
565
进程和线程是计算机科学中重要的概念,用于管理程序的执行和资源分配。进程是操作系统中的一个独立执行单位,拥有自己的内存空间和系统资源。每个进程都可以包含一个或多个线程,线程是进程内的实际执行单元,共享相同的内存空间和资源。本文简要介绍了进程和线程的概念、特点以及它们在计算机系统中的作用。进程和线程的使用使得程序能够并发执行,提高了系统的效率和性能。然而,进程和线程的管理也面临着诸多挑战,如资源竞争、死锁等问题。因此,合理地使用和管理进程与线程对于保障系统稳定运行和提升性能至关重要。
《Spring Security 简易速速上手小册》第6章 Web 安全性(2024 最新版)
江帅帅
03-01
1197
在某些场景下,应用可能需要更灵活地处理 CSRF 令牌,比如在分布式系统中共享 CSRF 令牌或在客户端和服务器之间以不同的方式传递令牌。这时,通过实现自定义 CSRF 令牌仓库()来满足这些特定需求就显得尤为重要。现在,当用户访问应用并生成 CSRF 令牌时,这些令牌将被存储在 Redis 中。无论用户是通过哪个实例发起请求,应用都能从 Redis 中检索到相应的 CSRF 令牌,并进行验证。
AES对称加密算法python
12-08
以下是使用Python实现AES对称加密算法的示例代码:
```python
from Crypto.Cipher import AES
import base64
# 加密函数
def encrypt(text, key):
# 将密钥转换为16字节长度的bytes类型
key = key.encode('utf-8')
key = key.ljust(16, b'\0')
# 将明文转换为bytes类型
text = text.encode('utf-8')
# 使用AES加密算法进行加密
cipher = AES.new(key, AES.MODE_ECB)
encrypted_text = cipher.encrypt(text)
# 将加密后的bytes类型数据转换为base64编码的字符串
encrypted_text = base64.b64encode(encrypted_text).decode('utf-8')
return encrypted_text
# 解密函数
def decrypt(encrypted_text, key):
# 将密钥转换为16字节长度的bytes类型
key = key.encode('utf-8')
key = key.ljust(16, b'\0')
# 将密文转换为bytes类型
encrypted_text = base64.b64decode(encrypted_text)
# 使用AES加密算法进行解密
cipher = AES.new(key, AES.MODE_ECB)
decrypted_text = cipher.decrypt(encrypted_text)
# 将解密后的bytes类型数据转换为字符串
decrypted_text = decrypted_text.decode('utf-8')
return decrypted_text
# 测试
text = 'Hello, world!'
key = '1234567890123456'
encrypted_text = encrypt(text, key)
print('加密后的密文:', encrypted_text)
decrypted_text = decrypt(encrypted_text, key)
print('解密后的明文:', decrypted_text)
```
上述代码使用了Python的`Crypto`库实现了AES对称加密算法。其中,`encrypt`函数用于加密明文,`decrypt`函数用于解密密文。在加密和解密过程中,需要使用相同的密钥。在本例中,密钥为16字节长度的字符串。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
季风泯灭的季节
CSDN认证博客专家
CSDN认证企业博客
码龄6年
暂无认证
111
原创
420
周排名
1万+
总排名
9万+
访问
等级
2101
积分
541
粉丝
643
获赞
94
评论
565
收藏
私信
关注
热门文章
CAS操作
2762
Oracle重新导入数据
2741
Seata 入门知识
2460
探索便捷办公新选择:ONLYOFFICE 桌面编辑器
2387
JVM整体结构解析
2350
分类专栏
微服务
8篇
排序算法
6篇
Elastic Stack 技术栈及其详细应用
20篇
并发编程
13篇
加密算法
5篇
转载
9篇
CSDN活动推广
1篇
minio
2篇
架构设计
1篇
性能监控
2篇
Linux常用命令
1篇
财务软件
Redis
1篇
服务日志
1篇
Kubtenates
1篇
JVM虚拟机
9篇
helm
1篇
dubbo
前端基础
2篇
前端框架
1篇
Java基础
7篇
Java框架
6篇
开发工具
2篇
MySQL数据库
17篇
Oracle数据库
5篇
数据库基础
4篇
最新评论
Kibana安装部署
枫叶丹4:
大佬高质量文章,图文并茂,逻辑清晰,受益匪浅,期待大佬新作。
【排序算法】深入理解归并排序算法:从原理到实现
韩曙亮:
博主的文章细节很到位,兼顾实用性和可操作性,内容和细节都很到位,期待博主持续带来更多好文
【排序算法】推排序算法解析:从原理到实现
季风泯灭的季节:
感谢妄北y大佬支持!共同努力
Kibana安装部署
꧁༺零落༻꧂:
不错的领域文章分享,内容很丰富,细节很到位
Kibana安装部署
Aileen_0v0:
High quality and excellent article, the blogger's article details are well done, balancing practicality and operability, supporting the blogger.
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
【排序算法】推排序算法解析:从原理到实现
【排序算法】深入理解归并排序算法:从原理到实现
【排序算法】深入理解快速排序算法:从原理到实现
2024年39篇
2023年26篇
2022年48篇
2021年2篇
2019年2篇
2018年9篇
目录
目录
分类专栏
微服务
8篇
排序算法
6篇
Elastic Stack 技术栈及其详细应用
20篇
并发编程
13篇
加密算法
5篇
转载
9篇
CSDN活动推广
1篇
minio
2篇
架构设计
1篇
性能监控
2篇
Linux常用命令
1篇
财务软件
Redis
1篇
服务日志
1篇
Kubtenates
1篇
JVM虚拟机
9篇
helm
1篇
dubbo
前端基础
2篇
前端框架
1篇
Java基础
7篇
Java框架
6篇
开发工具
2篇
MySQL数据库
17篇
Oracle数据库
5篇
数据库基础
4篇
目录
评论 21
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
季风泯灭的季节
你的鼓励将是我创作的最大动力
¥1
¥2
¥4
¥6
¥10
¥20
扫码支付:¥1
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现-CSDN博客
>一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现-CSDN博客
一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现
码农StayUp
已于 2022-03-12 20:16:37 修改
阅读量7k
收藏
30
点赞数
12
分类专栏:
信息安全
文章标签:
java
信息安全
对称加密
于 2021-11-08 08:09:51 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gozhuyinglong/article/details/121200733
版权
信息安全
专栏收录该内容
2 篇文章
2 订阅
订阅专栏
微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos
上篇介绍了《单向散列加密》,它是一种消息摘要算法。该算法在信息安全领域,有很多重要的应用场景,比如:用户密码保护、数字签名、文件完整性校验、云盘妙传等。
单向散列加密只能够对消息进行加密(严格来说是计算消息的摘要),想要实现对密文解密,需要使用其它加密方式了。今天介绍一个在信息安全领域中,比较重要的加密方式——对称加密。
下面是本篇讲述内容:
加密、解密和密钥
加密(Encrypt)是从明文生成密文的步骤,解密(Decrypt)是从密文还原成明文的步骤,而这两个步骤都需要用到密钥(Key)。这和我们现实中,用钥匙上锁和开锁是一样的。
什么是对称加密
对称加密(Symmetric Cryptography)是密码学中的一类加密算法,这类算法在加密和解密时,使用相同的密钥。
对称加密又称为共享密钥加密,其最大的缺点是,对称加密的安全性依赖于密钥,一旦泄露,就意味着任何人都能解密消息。
对称加密的优点是加密速度快,所以在很多场合被使用。
常见算法
本节介绍对称加密的一些常见算法,包括DES、3DES和AES。
DES算法
DES(Data Encryption Standard,中文:数据加密标准),是一种对称加密算法。该算法在1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并于1977年被发布,随后在国际上广泛流传开来。然而,随着计算机的进步,DES 已经能够被暴力破解,所以该算法已经不安全了。
DES是一种分组密码(Block Cipher,或者叫块加密),即将明文按64比特进行分组加密,每组生成64位比特的密文。它的密钥长度为56比特(从规格上来说,密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实际长度为56比特)。
3DES算法
三重数据加密算法(Triple Data Encryption Algorithm,缩写为TDEA),简称3DES(Triple-DES),是DES的增强版,相当于对每组数据应用了三次DES算法。
由于DES算法的密钥长度过短,容易被暴力破解,为了解决这一问题,设计出了该算法。它使用简单的方法,通过增加DES密钥长度的方式来避免类似攻击,而不是一种全新的密码算法。
该算法在每次应用DES时,使用不同的密钥,所以有三把独立密钥。这三把密钥组成一起,是一个长度为168(56 + 56 + 56)比特的密钥,所以3DES算法的密钥总长度为168比特。
3DES的加密过程,并不是进行三次DES加密(加密→加密→加密),而是以密钥1、密钥2、密钥3的顺序,进行加密→解密→加密的过程。
3DES的解密过程和加密正好相反,是以密钥3、密钥2、密钥1的顺序,进行解密→加密→解密的操作。
AES算法
AES(Advanced Encryption Standard),即高级加密标准,是取代DES算法的一种新的对称加密算法。AES算法是从全世界的企业和密码学家,提交的对称密码算法中竞选出来的,最终 Rijndael 加密算法胜出,所以AES又称为 Rijndael 加密算法。
AES也是一种分组密码,它的分组长度为128比特,密钥长度可以为128比特、192比特或256比特。
分组密码的模式
上面介绍的DES、3DES和AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密更长的明文,就需要对分组密码进行迭代,而分组密码的迭代方法称为分组密码的模式(Model)。简而一句话:分组密码的模式,就是分组密码的迭代方式。
分组密码有很多种模式,这里主要介绍以下几种:ECB、CBC、CFB、OFB、CTR。
明文分组与密文分组
在下面对模式的介绍时,会用到两个术语,这里先介绍一下:
在分组密码中,我们称每组的明文为明文分组,每组生成的密文称为密文分组。
若将所有的明文分组合并起来就是完整的明文(先忽略填充),将所以的密文分组合并起来就是完整的密文。
ECB模式
ECB(Electronic CodeBook)模式,即电子密码本模式。该模式是将明文分组,加密后直接成为密文分组,分组之间没有关系。
ECB模式是所有模式中最简单的一种,该模式的明文分组与密文分组是一一对应的关系,若明文分组相同,其密文分组也一定相同。因此,ECB模式也是最不安全的模式。
CBC模式
CBC(Cipher Block Chaining)模式,即密码分组链接模式。该模式首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。只有第一个明文分组特殊,需要提前为其生成一个与分组长度相同的比特序列,进行XOR运算,这个比特序列称为初始化向量(Initialization Vector),简称IV。
CFB模式
CFB(Cipher FeedBack)模式,即密文反馈模式。该模式首先将前一个密文分组进行加密,再与当前明文分组进行XOR运算,来生成密文分组。同样CFB模式也需要一个IV。
OFB模式
OFB(Output FeedBack)模式,即输出反馈模式。该模式会产生一个密钥流,即将密码算法的前一个输出值,做为当前密码算法的输入值。该输入值再与明文分组进行XOR运行,计算得出密文分组。该模式需要一个IV,进行加密后做为第一个分组的输入。
CTR模式
CTR(CounTeR)模式,即计数器模式。该模式也会产生一个密钥流,它通过递增一个计数器来产生连续的密钥流。对该计数器进行加密,再与明文分组进行XOR运算,计算得出密文分组。
分组密码的填充
在分组密码中,当数据长度不符合分组长度时,需要按一定的方式,将尾部明文分组进行填充,这种将尾部分组数据填满的方法称为填充(Padding)。
No Padding
即不填充,要求明文的长度,必须是加密算法分组长度的整数倍。
... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD DD |
ANSI X9.23
在填充字节序列中,最后一个字节填充为需要填充的字节长度,其余字节填充0。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
ISO 10126
在填充字节序列中,最后一个字节填充为需要填充的字节长度,其余字节填充随机数。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
PKCS#5和PKCS#7
在填充字节序列中,每个字节填充为需要填充的字节长度。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
ISO/IEC 7816-4
在填充字节序列中,第一个字节填充固定值80,其余字节填充0。若只需填充一个字节,则直接填充80。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 80 00 00 00 |
... | DD DD DD DD DD DD DD DD | DD DD DD DD DD DD DD 80 |
Zero Padding
在填充字节序列中,每个字节填充为0。
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
Java代码实现
Java在底层已经封装好了对称加密的实现, 我们只需要使用即可。现在介绍几个重要的类:
SecureRandom类
SecureRandom类是一个强安全的随机数生成器(Random Number Generator,简称:RNG),加密相关的推荐使用此随机数生成器。
我们可以通过构造方法生成一个实例,或者向构造方法传递一个种子来创建实例。
SecureRandom random = new SecureRandom();
KeyGenerator类
KeyGenerator类是对称密码的密钥生成器,需要指定加密算法,来生成相应的密钥。
Java中支持的算法:
AES (128)DES (56)DESede (168)HmacSHA1HmacSHA256
下面是一些标准算法的介绍:
生成密钥代码如下:
/**
* 通过密码和算法获取 Key 对象
*
* @param key 密钥
* @param algorithm 算法,例如:AES (128)、DES (56)、DESede (168)、HmacSHA1、HmacSHA256
* @return 密钥 Key
* @throws Exception
*/
private static Key getKey(byte[] key, String algorithm) throws Exception {
// 通过算法获取 KeyGenerator 对象
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
// 使用密钥做为随机数,初始化 KeyGenerator 对象
keyGenerator.init(new SecureRandom(key));
// 生成 Key
return keyGenerator.generateKey();
}
Cipher类
Cipher类提供了加密和解密的功能。该类需要指定一个转换(Transformation)来创建一个实例,转换的命名方式:算法名称/工作模式/填充方式。
下面是Java支持的转换:
AES/CBC/NoPadding (128)AES/CBC/PKCS5Padding (128)AES/ECB/NoPadding (128)AES/ECB/PKCS5Padding (128)DES/CBC/NoPadding (56)DES/CBC/PKCS5Padding (56)DES/ECB/NoPadding (56)DES/ECB/PKCS5Padding (56)DESede/CBC/NoPadding (168)DESede/CBC/PKCS5Padding (168)DESede/ECB/NoPadding (168)DESede/ECB/PKCS5Padding (168)RSA/ECB/PKCS1Padding (1024, 2048)RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
下面是一些标准的模式:
下面是一些标准的填充:
加密代码如下:
private static final String DES_ALGORITHM = "DES";
private static final String DES_TRANSFORMATION = "DES/ECB/PKCS5Padding";
/**
* DES 加密
*
* @param data 原始数据
* @param key 密钥
* @return 密文
*/
private static byte[] encryptDES(byte[] data, byte[] key) throws Exception {
// 获取 DES Key
Key secretKey = getKey(key, DES_ALGORITHM);
// 通过标准转换获取 Cipher 对象, 由该对象完成实际的加密操作
Cipher cipher = Cipher.getInstance(DES_TRANSFORMATION);
// 通过加密模式、密钥,初始化 Cipher 对象
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 生成密文
return cipher.doFinal(data);
}
解密代码如下:
private static final String DES_ALGORITHM = "DES";
private static final String DES_TRANSFORMATION = "DES/ECB/PKCS5Padding";
/**
* DES 解密
*
* @param data 密文
* @param key 密钥
* @return 原始数据
*/
private static byte[] decryptDES(byte[] data, byte[] key) throws Exception {
// 获取 DES Key
Key secretKey = getKey(key, DES_ALGORITHM);
// 通过标准转换获取 Cipher 对象, 由该对象完成实际的加密操作
Cipher cipher = Cipher.getInstance(DES_TRANSFORMATION);
// 通过解密模式、密钥,初始化 Cipher 对象
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 生成原始数据
return cipher.doFinal(data);
}
完整代码
完整代码请访问我的Github,若对你有帮助,欢迎给个⭐,感谢~~
https://github.com/gozhuyinglong/blog-demos/blob/main/java-source-analysis/src/main/java/io/github/gozhuyinglong/utils/SymmetricKeyUtil.java
推荐阅读
一文搞懂单向散列函数Java反射机制:跟着代码学反射JDK动态代理:不仅要学会用,更要掌握其原理
关注博主即可阅读全文
优惠劵
码农StayUp
关注
关注
12
点赞
踩
30
收藏
觉得还不错?
一键收藏
打赏
知道了
2
评论
一文搞懂对称加密:加密算法、工作模式、填充方式、代码实现
微信搜索:码农StayUp主页地址:https://gozhuyinglong.github.io源码分享:https://github.com/gozhuyinglong/blog-demos上篇介绍了《单向散列加密》,它是一种消息摘要算法。该算法在信息安全领域,有很多重要的应用场景,比如:用户密码保护、数字签名、文件完整性校验、云盘妙传等。单向散列加密只能够对消息进行加密(严格来说是计算消息的摘要),想要实现对密文解密,需要使用其它加密方式了。今天介绍一个在信息安全领域中,比较重要的加密方..
复制链接
扫一扫
专栏目录
快速搞懂Android口令加密(一)
09-02
主要介绍了快速搞懂Android口令加密(一)的相关资料,需要的朋友可以参考下
前端攻城狮都要懂的加密算法之总结,一篇文章教你搞懂加密。
江咏之
05-24
1136
在信息安全越来越受重视的今天,前端的各种加密也变得更加重要。通常跟服务器的交互中,为保障数据传输的安全性,避免被人抓包篡改数据,除了 https 的应用,还需要对传输数据进行加解密。
目录标题一、对称加密算法二、非对称加密算法三、Hash 算法四、base64编码总结
目前常见的加密算法可以分成三类
对称加密算法:AES、DES、3DES...
非对称加密算法:RSA、ECC(移动设备用)...
Hash 算法:MD5、...
一、对称加密算法
对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密.
2 条评论
您还未登录,请先
登录
后发表或查看评论
Android RSA加密解密的坑(RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING)
qq_27494201的博客
12-27
501
【代码】Android RSA加密的坑(RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING)
加密算法(对称加密与非对称加密)
Mr_Susy的博客
03-18
1393
加密算法思维导图
对称加密
概念
对称加密也叫私钥加密,指加解密使用相同秘钥的加密算法。
数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。因此对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,
一文彻底搞懂加密、数字签名和数字证书,看不懂你打我!
编程指北
09-20
1万+
前言
这本是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视频。
在一旁玩手机的女朋友突然问”你知道数字证书是来干啥的不,为啥浏览器提示证书不可信?”
你要说这个,那我可来劲了,于是乎从加密、数字签名一直讲到了数字证书。。。终于把女朋友讲睡着了,独自写下这篇文章。
正文
如果你能非常清晰的回答出以下问题,可以直接拉到最下面帮我点个赞~,把时间用去陪陪女朋友:
非对称加密中公私钥都可以加密,那么什么时候用公钥加密,什么时候用私钥“加密” ?
什么是数字签名,数字签名的作
加密就像玩魔方----图文详解对称加密(DES、AES)
稀有气体的技术博客
10-11
1475
你知道吗?如果不是密码学的发展,可能计算机的出现还要晚很多年。
众所周知,图灵是计算机科学之父。图灵早年从事密码破解工作。在二战期间,图灵对破解德军 Enigma 密码机做出了巨大贡献,从而加快了二战结束的步伐。由于破解密码需要大量的计算工作,所以图灵参与了最早的电子计算机研发工作。最终图灵奠定了计算机科学的基础。
某种意义上可以说是密码学的发展加快了了计算机的产生。
为什么需要加密?
密码学源于解决消息传递过程中的安全问题。
我们可以思考下面的一个场景。上大学的小明给爸爸写信,让爸爸汇款1000块钱给他报
什么是对称加密(对称加密简介)
Atlan_blog
12-04
2万+
什么是对称加密什么是对称加密编码加密算法DES什么是DES加密和解密3DES什么是3DES3DES加密解密AES什么是AESAES加密解密
什么是对称加密
对称加密:也称为对称密码,是指在加密和解密时使用同一密钥得加密方式
编码
现代的密码都是建立在计算机的基础之上的,这是因为现代的密码所处理的数据量非常大,而且密码算法也非常复杂,不借助计算机的力量就无法完成加密和解密的操作。
计算机的操作对象并不是文字,而是由0和1排列而成的比特序列。无论是文字、图像、声音、视频还是程序,在计算机中都是用比特序列来表示
对称加密与非对称加密算法
热门推荐
new9232的博客
01-24
3万+
对称加密算法又称为传统密码算法,加密密钥和解密密钥是相同的。对称加密算法要求通信双方在开始通信前,要首先商定一个用于加密和解密的密钥。算法的安全性就依赖于这个密钥,如果这个密钥被泄露了,就意味着通信不再安全。
对称加密算法
qq_53663858的博客
06-15
4232
对称加密算法的原理
加解密篇 - 对称加密算法 (DES、3DES、AES、RC)
ss810540895的博客
05-12
2114
我们开发通常采用128位16个字节的密钥,我们使用 AES 加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成**(我们开发时传入的那个为初始密钥,除了初始密钥以外,后面每一轮的密钥都是由上一轮的密钥扩展而来的,密钥扩展有四个步骤:排列、置换、与轮常量异或、生成下一轮密钥的其他列)**。比起最初的 DES,AES 更为安全。采用单钥密码系统的加密方法,同一个密钥用来加密和解密,常见的对称加密算法有 DES,3DES,AES,RC2,RC4,RC5等。
五种对称加密算法总结
Allen技术小站
09-08
8929
1、DES
已破解,不再安全,基本没有企业在用了
是对称加密算法的基石,具有学习价值
密钥长度56(JDK)、56/64(BC)
2、DESede(三重DES)
早于AES出现来替代DES
计算密钥时间太长、加密效率不高,所以也基本上不用
密钥长度112/168(JDK)、128/192(BC)
3、AES
最常用的对称加密算法
密钥建立时间短、灵敏性好、内存需求低(不管怎样,反正就是好)
实际使用中,使用工作模式为CTR(最好用BC去实现),此工作模式需要引入IV参数(16位的字节数组)
密钥长度128/
一文搞懂全链路监控:方案概述与比较
01-27
互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于...
一文搞懂Raft算法
01-27
raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos。但Paxos是:少数真正理解的人觉得简单...这些年最为火热的加密货币(比
一文彻底搞懂BP算法:原理推导+数据演示+项目实战.zip
12-29
大数据和算法、数据分析的应用场景非常广泛,可以涵盖各个行业和领域。以下是一些常见的大数据和算法、数据分析应用场景: 电子商务:通过收集用户消费习惯、季节和产品生命周期的数据,建立算法模型来确定下一个月...
一文读懂遗传算法工作原理(附Python实现).pdf
06-19
一文读懂遗传算法工作原理(附Python实现).pdf
LeetCode hot100-4
alike_meng的博客
03-04
502
LeetCode热题100第4题
Java自学day4
nanshenchao的博客
03-03
1236
数字进行运算时,数据类型不一样不能运算,需要一样的,才能运算。类型转换的分类:1.隐式转换(自动类型提升):取值范围小的数值转向取值范围大的数值2.强制转换:取值范围大的数值转向取值范围小的数值如果把一个取值范围大的数值,赋值给取值范围小的变量。是不允许直接赋值的。如果一定要这么做就需要加入强制转换格式:目标数据类型 变量名 = (目标数据类型)被强转的数据;
【Web】浅聊JDBC的SPI机制是怎么实现的——DriverManager
最新发布
uuzeray的博客
03-06
1008
【Web】浅浅地聊JDBC java.sql.Driver的SPI后门-CSDN博客上篇文章我们做到了知其然,知道了JDBC有SPI机制,并且可以利用其Driver后门这篇文章希望可以做到知其所以然,对JDBC的SPI机制的来源做到心里有数。
类加载器(Class Loader)与双亲委派模型(Parent Delegation Model)
小湘西的博客
03-01
853
类加载器是Java中用于加载类文件(.class 文件)到Java虚拟机(JVM)中的一部分。它负责将类的字节码转换成Java虚拟机能理解的Class对象。类加载器在Java程序运行期间,负责动态加载、链接和初始化类。
SM4国产加密算法 js实现
08-13
对于SM4国产加密算法的js实现,可以使用SM4CryptECBWithPKCS7Padding方法进行加密和解密操作。该方法接收两个参数,第一个参数是要加密或解密的值,第二个参数是标志位,1表示加密,0表示解密。SM4算法常用于政府系统的数据传输加密,可以在前端对参数进行加密,然后后台对加密的数据进行解密并存储到数据库中,以确保数据在传输过程中的安全性。此外,还可以使用md5算法进行完整性防篡改校验,以确保数据的完整性。在Vue框架中实现加密方案的流程可以参考相关文档和资源。123
#### 引用[.reference_title]
- *1* *2* [一文带你学会国产加密算法SM4的vue实现方案](https://blog.csdn.net/hanqing456/article/details/106534537)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
- *3* [【JS 逆向百例】医保局 SM2+SM4 国产加密算法实战](https://blog.csdn.net/kdl_csdn/article/details/121269937)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
码农StayUp
CSDN认证博客专家
CSDN认证企业博客
码龄15年
全栈领域优质创作者
449
原创
702
周排名
2429
总排名
68万+
访问
等级
8164
积分
1万+
粉丝
1899
获赞
380
评论
2519
收藏
私信
关注
热门文章
IDEA教程之Activiti插件
102835
人生就是一个不断学习的过程
41924
【Python 教程】list 列表遍历的 4 种方法
37342
IDEA教程之Gitee插件(码云)
26129
SpringBoot2.0日志配置实例
17934
分类专栏
C/C++等级考试(1~8级)历届真题解析
付费
185篇
Python等级考试(1~6级)历届真题解析
付费
70篇
Scratch等级考试(1~4级)历届真题解析
付费
65篇
C++等级认证CCF-GESP真题解析
付费
21篇
Python等级认证CCF-GESP真题解析
付费
21篇
Scratch等级认证CCF-GESP真题解析
付费
15篇
Sublime Text
1篇
Python 教程
4篇
Spring Boot 源码解析
3篇
Spring Boot 全家桶
13篇
Jenkins
1篇
Java 源码解析
2篇
Spring 源码解析
1篇
设计模式
4篇
信息安全
2篇
Netty
1篇
码农工具箱
4篇
Java数据结构与算法分析
11篇
开发工具
1篇
Java8新特性
3篇
JUC全家桶
2篇
Linux
1篇
Kafka
2篇
RabbitMQ
1篇
最新评论
2023年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
小书生逸晨:
有没有预览的?
Java8新特性 | List多字段排序(含示例代码)
wcuuchina:
List
.sorted(Comparator.comparing(ResBusinessCompensationDetailListDO::getCreateDateTIme, Comparator.reverseOrder())
.thenComparing(ResBusinessCompensationDetailListDO::getCreateDateTIme, Comparator.reverseOrder())
.thenComparing(ResBusinessCompensationDetailListDO::getId))
.collect(Collectors.toList());
2023年05月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
MSZ830724:
今年三月我就要考一级了,希望博主能第一时间更新试卷
THANKYOU
2023年05月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
码农StayUp:
你在专栏总目录里找C++解析的:https://blog.csdn.net/gozhuyinglong/article/details/132548677
2023年05月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
MSZ830724:
请问博主,能不能写一段以#include
using namespace std;
int main(){
}
为头文件的代码
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
2023年12月CCF-GESP编程能力等级认证Python编程八级真题解析
2023年12月CCF-GESP编程能力等级认证Python编程七级真题解析
《Scratch等级认证CCF-GESP真题解析》专栏总目录
2024
03月
9篇
02月
46篇
01月
45篇
2023年279篇
2022年13篇
2021年11篇
2020年36篇
2019年1篇
2018年18篇
目录
目录
分类专栏
C/C++等级考试(1~8级)历届真题解析
付费
185篇
Python等级考试(1~6级)历届真题解析
付费
70篇
Scratch等级考试(1~4级)历届真题解析
付费
65篇
C++等级认证CCF-GESP真题解析
付费
21篇
Python等级认证CCF-GESP真题解析
付费
21篇
Scratch等级认证CCF-GESP真题解析
付费
15篇
Sublime Text
1篇
Python 教程
4篇
Spring Boot 源码解析
3篇
Spring Boot 全家桶
13篇
Jenkins
1篇
Java 源码解析
2篇
Spring 源码解析
1篇
设计模式
4篇
信息安全
2篇
Netty
1篇
码农工具箱
4篇
Java数据结构与算法分析
11篇
开发工具
1篇
Java8新特性
3篇
JUC全家桶
2篇
Linux
1篇
Kafka
2篇
RabbitMQ
1篇
目录
评论 2
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
码农StayUp
你的鼓励将是我创作的最大动力
¥1
¥2
¥4
¥6
¥10
¥20
扫码支付:¥1
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值