女装网站建设的困难和不足,中国建筑人才证书查询官网,直播电商平台有哪些,可以做海报的网站前言 在区块链的整个体系中大量使用了密码学算法#xff0c;比如用于 PoW 的哈希算法#xff0c;用于完整性验证的 Merkle Tree#xff0c;用于交易签名与验证的数字签名算法#xff0c;用于隐私保护的零知识证明等等。 可以说密码学是保证区块链安全的基石#xff0c;而区…前言 在区块链的整个体系中大量使用了密码学算法比如用于 PoW 的哈希算法用于完整性验证的 Merkle Tree用于交易签名与验证的数字签名算法用于隐私保护的零知识证明等等。 可以说密码学是保证区块链安全的基石而区块链的广泛应用也推进了密码学的发展。在区块链内核 CITA 的 v0.18 中新增了「基于 Rust 语言的国密算法库」新特性。这次更新使用户在尊重版权的前提下即可自由调用 Rust 实现的国密算法库来匹配业务场景所需的国密签名算法大幅降低企业用户及开发者获得高性能区块链底层设计服务的成本方便用户打造最贴近业务需求的区块链。 现代信息安全的基本要求 信息的保密性 Confidentiality防止信息泄漏给未经授权的人加密解密技术信息的完整性 Integrity防止信息被未经授权的篡改消息认证码数字签名认证性 Authentication保证信息来自正确的发送者消息认证码数字签名不可否认性 Non-repudiation保证发送者不能否认他们已发送的消息数字签名 目录
前言
一、什么是密码学
二、古典密码学
古典密码学中最经典的两种算法
置换密码
代换密码
位移密码
代换密码的破解和发展
古典密码学的特点
三、古典密码的代码案例
置换密码案例
代换密码案例
位移密码案例
凯撒密码案例 一、什么是密码学
密码学的英语单词是 Cryptograghy是由希腊单词 Kryptos隐藏和 Graphin写派生出来的最初代表的意思是用来隐秘的传递信息。隐藏和写就是隐写在古典密码学的发展中就有一门称为隐写术的技术比如说藏头诗就是一种隐写术。在《巨人的陨落》中艾瑟尔和弟弟比利就是通过每隔两个单词就会加一个单词来作为加密后的密文这也是隐写术的一个例子。隐写术发展到今天演变为数字水印技术一般在文件中加一个标识信息即数字水印可以起到追踪溯源防伪和版权保护的作用。
密码学是网络安全、信息安全、区块链等产品的基础常见的非对称加密、对称加密、散列函数等都属于密码学范畴。 密码学一开始的功能是在有恶意攻击者存在的环境下保护双方通信安全现在是用来保护信息安全的核心技术。 所以密码学旨在保护协议免受攻击者攻击的一种安全措施使之成为安全协议 二、古典密码学
以时间划分1976 年以前的密码算法都属于古典密码学基本使用在军事机密和外交领域它的特点就是加解密过程简单一般用手工或机械就可以完成。古典密码学现在已经很少采用了然而研究古典密码的原理对于理解构造和分析现代密码都是十分有益的。尤其是对称加密技术它就是从古典密码学中演化进来的。 密码学术语 明文没有经过加密任何人都能看得懂的文字密文经过加密后的文字密钥明文与密文转换的参数 古典密码学中最经典的两种算法 置换密码 又称换位密码加密过程中明文的字母保持相同但是顺序被打乱。只要把位置恢复就能得到明文。 一个典型置换密码的例子公元前 500 年的古希腊斯巴达邦城存在一种叫做「棍子加密」的加密方法。找一个腰带将信息横着写在腰带上但是这个信息是完全打乱的需要一个可以解密的棍子将腰带缠绕在棍子上就可以恢复出明文。这也是最简单的置换密码的方式。后来随着抽象代数的出现有了矩阵之后就可以做一个复杂的置换加密对运算做一个置换用置换矩阵来解密恢复出明文。
代换密码 又称替换密码明文中的每一个字符被替换成密文中的另一个字符。接收者对密文做反向替换就可以恢复明文。 位移密码 位移密码是代换密码其中的一种最简单最典型的就是凯撒密码 凯撒密码它是一种单表代换密码加密方式就是通过对字母的位移进行加密比如把字母表右移三位上面是明文表下面是对应的密文表。如下图所示 代换密码的破解和发展
像凯撒密码一样每一个都有相应代表的位置像 A 代表着 DB 代表这 E。单表代换密码就很容易被破解只要用频率分析表就可以破解这是根据人类自然语言中字母出现的频率不同来进行破解的。比如英文 E 是使用最频繁的其次是 T/R/N/I/O/A/S 等有些字母使用的很少例如 Z/J/K/Q/X 等这样就可以获得英文字母使用频率分布表这个表是根据几本书获得的频率分析来获得的同时统计双字母组合和三字母组合的使用频率也非常有用。
有了破解的方法后密码学中也会相对应的出现防止破解的方法。
多名或同音代替密码
与简单代替密码类似只是映射是一对多的每个明文字母可以加密成多个密文字母。用已知明文攻击比较容易破解
多字母代替密码
每次对 L 个字母进行代换隐藏或均匀化字母的自然频度用于抵抗频率分析。比如 hill 密码用已知明文攻击比较容易破解。
多表代替密码
多代替密码可以说是古典密码学的巅峰之作是以一系列两个以上代换表依次对明文消息的字母进行代换的加密操作。先把明文分成多份代换表有很多个根据序列依次更换代换序列对每个序列进行加密。典型的代换密码vigenere cipher博福特密码enigma 密码机这个密码机可以说是古典密码学中最厉害的一种但是在 1940 年时被图灵给破解了。
古典密码学的特点
计算强度小出现在 DES 之前数据安全基于算法的保密。这和现代密码有很大的差距只要知道加密方法就能轻易的获取明文。现代的密码基于密钥的加密算法都是公开的而且公开的密码算法安全性更高能被更多人评论和使用加强漏洞的修补。以字母表为主要加密对象。古典密码大多数是对有意义的文字进行加密而现代密码是对比特序列进行加密。这也是现代密码和古典密码的区别而且古典密码的分析方法也是用字母频率分析表来破解的。替换和置换技术密码分析方法基于字母与字母组合的频率特性以及明文的可读性 三、古典密码的代码案例 用htmljsnode实现简单的置换密码、代换密码、位移密码、凯撒密码的加密以及解密 置换密码案例
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/title
/head
bodylabel forplainText明文/labelinput typetext name idplainTextbutton onclickencipher()加密/buttonbr密文input typetext idcipherText button onclickdecrypt()解密/buttonbr原文input typetext name idoriginal
/body
script// 置换规则是反转function encipher() {let plainText document.getElementById(plainText).value// 第一种js自带反转方法/* split()根据空字符串拆分数组reverse()数组反转元素位置join()数组转回字符串,且不带分隔符*/let newPlainText plainText.split().reverse().join()document.getElementById(cipherText).value newPlainText// 第二种/* 使用遍历以及api charAt()定义新的空字符串遍历strcharAt()是取字符串的一个字符(charAt() 方法可返回指定位置的字符。)先去最后一个字符再取倒数第二个…以此类推。都放到新的字符串前面。这样就是倒序的了.*/let newPlainTexts for(let i 1; iplainTextl.length; i){newPlainTexts newPlainTexts plainText.charAt(plainText.length-i)}document.getElementById(cipherText).value newPlainTexts}function decrypt() {let cipherText document.getElementById(cipherText).valuelet originalText cipherText.split().reverse().join()document.getElementById(original).value originalText}/script
/html
代换密码案例
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/title
/head
bodylabel forplainText明文:/labelinput typetext idplainTextbutton onclickencipher()加密/buttonbrlabel forcipherText密文:/labelinput typetext idcipherTextbutton onclickdecrypt()解密/buttonbrlabel fororiginal原文/labelinput typetext name idoriginal
/body
script//加密function encipher() {let plainText document.getElementById(plainText).value;//替换表const key {a: w, b: v, c: q, d: k, e: i, f: g, g: c,h: x, i: u, j: r, k: l, l: j, m: e, n: b,o: y, p: t, q: p, r: m, s: h, t: d, u: a,v: z, w: s, x: o, y: n, z: f};//将输入的明文统一转换为小写便于匹配替换表/* js自带toLowerCase() 将字符串大写转换成小写js自带toUpperCase() 将字符串大写转换成小写*/plainText plainText.toLowerCase();let cipherText ;for (let i 0; i plainText.length; i) {const char plainText[i];cipherText key[char];}document.getElementById(cipherText).value cipherText;}// 解密function decrypt() {let cipherText document.getElementById(cipherText).value;const key {w: a, v: b, q: c, k: d, i: e, g: f, c: g,x: h, u: i, r: j, l: k, j: l, e: m, b: n,y: o, t: p, p: q, m: r, h: s, d: t, a: u,z: v, s: w, o: x, n: y, f: z};let original for(let i 0; icipherText.length; i){let char cipherText[i]char key[char]original char}document.getElementById(original).value original;}/script
/html 当然不一定是用对象也可以用数组数组更简单一点 位移密码案例
!DOCTYPE html
html langenheadmeta charsetUTF-8meta nameviewport contentwidth, initial-scale1.0title移位密码/title
/headbodyh1移位密码/h1label forplainText明文/labelinput typetext idplainTextbrlabel forshift偏移量/labelinput typenumber idshiftinput typecheckbox idshiftDirection左移位button onclickencipher()加密or解密/buttonbrlabel forcipherText密文/labelinput typetext idcipherText
/body
script// 加密function encipher() {let plainText document.getElementById(plainText).value;const shift parseInt(document.getElementById(shift).value);const isLeftShift document.getElementById(shiftDirection).checked;plainText plainText.toLowerCase();var cipherText ;for (var i 0; i plainText.length; i) {var char plainText[i];/* match是js自带的一个函数用于匹配字符串内的元素正则match(/元素/可选参数) 普通:match(元素)可选参数: g全局匹配 i不区分大小写匹配 gi全局不分大小写*/if (char.match(/[a-z]/i)) {// 移位右加左减const code plainText.charCodeAt(i);var shiftedCode;if (isLeftShift) {shiftedCode code - shift;} else {shiftedCode code shift;}// 解决头尾问题if (char.match(/[a-z]/)) {if (char.match(/[a-z]/) shiftedCode 97) {shiftedCode 26;} else if (char.match(/[a-z]/) shiftedCode 122) {shiftedCode - 26;}}// 将unicode值转回字符 String.fromCharCode()char String.fromCharCode(shiftedCode);}cipherText char;}document.getElementById(cipherText).value cipherText;}/script/html 右移的可以使用左移恢复明文左移的可以使用右移恢复 bug不区分大小写 以下凯撒密码解决该bug 凯撒密码案例
!DOCTYPE html
html langenheadmeta charsetUTF-8meta nameviewport contentwidth, initial-scale1.0titleDocument/title
/headbodyh1凯撒密码/h1明文input typetext idplaintextbr偏移值input typenumber idshiftbrbutton onclickencrypt()加密/buttonbutton onclickdecrypt()解密/buttonbr密文input typetext idciphertext readonlybr解密后input typetext iddecryptedText readonly
/body/htmlscript// 处理加密按钮点击事件 function encrypt() {let plaintext document.getElementById(plaintext).value;let shift parseInt(document.getElementById(shift).value);let ciphertext caesarCipherEncrypt(plaintext, shift);document.getElementById(ciphertext).value ciphertext;}// 处理解密按钮点击事件 function decrypt() {let ciphertext document.getElementById(ciphertext).value;let shift parseInt(document.getElementById(shift).value);let decryptedText caesarCipherDecrypt(ciphertext, shift);document.getElementById(decryptedText).value decryptedText;} // 凯撒密码加密函数 function caesarCipherEncrypt(text, shift) {let encryptedText ;for (let i 0; i text.length; i) {let char text[i];if (char.match(/[a-z]/i)) {let code char.charCodeAt();if (code 65 code 90) { char String.fromCharCode(((code - 65 shift) % 26) 65);} else if (code 97 code 122) {char String.fromCharCode(((code - 97 shift) % 26) 97);}} encryptedText char;} return encryptedText; }// 凯撒密码解密函数 function caesarCipherDecrypt(text, shift) {let decryptedText ;for (let i 0; i text.length; i) {let char text[i];if (char.match(/[a-z]/i)) {let code char.charCodeAt();if (code 65 code 90) {char String.fromCharCode(((code - 65 - shift 26) % 26) 65);}else if (code 97 code 122) { // 小写字母 char String.fromCharCode(((code - 97 - shift 26) % 26) 97);}} decryptedText char;} return decryptedText;}/script