密码学常用场景及其算法实现原理

导读

这是我的第一篇博文。在我本科学到的密码学课上,密码学就给我留下了理论艰深,概念繁多的可怕阴影,秘钥长度之长,处理过程之繁琐曾让我一度怀疑自己不是一个合格的工科生。因区块链开发中再次涉及到了密码学的相关知识,所以这几天又系统的学习了一遍,本文是一些对密码学的知识的整理。首先,我会对密码学学科的概念及背景进行简单介绍。其次,我会通过具体案例来说明密码学的安全原理。最后,我对现在不同的加密算法库及其应用场景进行了分类整理,方面大家对照选取。

本文的主要参考博客如下:

《密码学一小时》https://blog.helong.info/blog/2015/04/12/translate-Everything-you-need-to-know-about-cryptgraphy-in-1-hour/

《现代密码学指南》https://blog.helong.info/blog/2015/06/06/modern-crypto/

《Node.js区块链开发》https://blog.csdn.net/shebao3333/article/details/79538354

一.为什么需要密码学?

就如人穿衣是为了保证个体隐私性一样,在复杂的互联网上传输的数据同样需要隐私性。密码学作为一门研究如何隐秘的传输信息的学科,是为互联网中传输数据穿衣加盾的最好工具。

二.密码学如何保证信息安全?

著名密码学家Colin Percival 在其公开演讲Everything you need to know about cryptography in 1 hour中曾指出,密码学被攻破常常是因为编写者使用错误的工具或者以错误的方式使用它们,经验告诉我们不要尝试亲自写密码学代码,因为那往往都是有漏洞的。

密码学中主要研究三个对象:

1.明文(plaintext):我们想要保护的原始数据

2.密文(ciphertext):经过密码学加密处理后的数据,这部分数据往往会被攻击者得到

3.秘钥(secret key):是明文密文相互转化的工具

下面我会以《Node.js区块链开发》中的一个小例子,来具体说明密码学是如何保证数据在互联网中的安全传输的。

安全需求:

一个男生Bob想要和自己心仪的女生Alice表白,说出“I LOVE YOU”。但是Bob很腼腆不敢当面表达自己的心声,因此他就想到将这句话使用信息加密的方式传输给他,让女生Alice使用密码进行解密,搞一波摩尔斯电码的浪漫。为了保证男生可以以这种方式表白成功,他需要考虑以下四个问题:

(1)加密:信息只能女生Alice看见,其他人不可以看见

(2)解密:女生Alice在收到加密后的信息后,可以成功解密得到男生的心声“I LOVE YOU”

(3)签名:男生Bob为信息签名,保证信息在传递的过程中不被修改,类似于我们日常生活中的笔迹签名

(4)验证:女生收到信息后根据签名的签名可以确定信息确实为男生所传递

解决步骤:

(1)生成密钥对(密码是打开密码箱的唯一方式)

//加载工具模块,crypto用来加密解密信息, ed25519用来签名验证信息
1 var crypto=require("crypto"); 

2 var ed25519=require("ed25519");
//选取密码,生成对应信息摘要,继而生成相应的公私钥对  BobKeyPair(publickey,privatekey)
1 var password="123456"; //密码
2 var hash=crypto.createHash("sha256").update(plaintext).digest(); //明文摘要
3 var BobKeyPair=ed25519.MakeKeypair(hash); //为了使得心仪女生Alice知道心意,Bob将BobKeyPair.publicKey传给Alice

(2)Bob加密信息

//使用公钥 BobKeyPair.publicKey 进行加密
1 var plaintext="Alice,I Love you!"; //明文
2 var msgCiphered=cipher("aes192",BobKeyPair.publicKey,plaintext); //密文

(3)Bob给信息签名

//使用私钥 BobKeyPair.privateKey 进行签名
1 var Bobsig=ed25519.Sign(new Buffer(msgCiphered,"utf-8"),BobKeyPair.privateKey);

(4)Alice验证并解密加密后的信息(msgCiphered,Bobsig)

//为了安全起见,一般都是先验证安全性,再去解密信息,这符合我们的常识
//使用Bob之前提供的公钥进行签名认证,确认信息的发送者确实是Bob则进行解密操作,否则返回错误信息
1 if(ed25519.Verify(new Buffer(msgCiphered,"utf-8"),BobSig,BobKeyPair.publicKey)){
2   console.log("签名合法,确实是Bob发来的信息!");
3   var Desmsg=decipher("aes192",BobKeyPair.publicKey msgCiphered);
4   console.log("Bob said:"+Desmsg);
5 ) else{
6   console.log("对方不是Bob,要小心");
7 }

经过一系列的操作,Bob终于表达了自己的想法,且保证没有被其他人发现自己的心思。希望以上的小故事能让你对密码学的加解密过程有一个大致的了解,对密码学的探索欲望也强了一点。

三.不同情境下如何选择相应的加密算法?

上一节密码学如何保证信息安全中有提到,秘钥(secret key)是明文与密文成功转换的关键所在。因此就有了著名的对称加密和非对称加密两种算法。接下来我会从不同的方面分别给出对应的选择策略

对称加密:加密和解密的秘钥key至始至终使用的是同一个

非对称加密:加密和解密相互转换时使用的秘钥不同,一个叫公钥一个叫私钥

1.数据加密算法选择(ECC>RSA)

(1)NaCl库/libsodium库中的crypto_secretbox()/crypto_secretbox_open() 函数》》》》》》》》(2)Chacha20-Poly1305 算法》》》》》》》》》(3)AES-GCM 算法

三者按优先级排序推荐使用,具体区别请查看《现代密码学实践指南》

2.秘钥长度选择(推荐256bit)

下表对比了相同安全程度时,不同算法的密钥长度,单位:bit

3.签名算法选择

对称加密:HMAC类算法(择SHA2类的算法:: SHA-256, SHA-384, SHA-512, SHA-512/256)

SHA2类算法的区别于介绍可见:https://en.wikipedia.org/wiki/SHA-2

非对称加密:NaCl,Ed25519

4.随机ID生成(推荐256bit)

一定要使用 /dev/urandom

避免用户空间的随机数生成器如:havaged,prngs,egd,等

5.客户端-服务器结构层的传输协议选择(TLS)

6.网站(支持https协议)选择

OpenSSL,Google的BoringSSL,或者是 AWS的 ELB 都是不错的选择

后记

以上是在学习的过程中的一点积累和认识,因非专业密码学专业出身里面难免会有不清楚的地方,希望以后可以再接再厉!!

原文地址:https://www.cnblogs.com/dxtlearningblockchain/p/10776780.html

时间: 2024-10-07 08:54:11

密码学常用场景及其算法实现原理的相关文章

RSA算法之原理篇

序言 RSA算法是出现最早得到广泛应用的公钥加密算法.它在通信加密.签名认证等领域都起着重要作用. 历史 RSA算法最早由英国数学家Clifford Cocks在1973年发明,但由于当时被英国政府列为最高机密,直到死后不久其工作成果才被公布.而1977年,Ron Rivest.Adi Shamir 和 Leonard Adleman三人在MIT合作发表了一篇完整描述RSA算法的论文,被正式承认为该算法的发明者.RSA这个名字也正是由三人姓氏的首字母组成. 很有意思的一件事情是,RSA算法并不是

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果

本文完全转载:http://www.cnblogs.com/Imageshop/p/3281703.html,再次仅当学习交流使用.. <Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效果(速度可实时) 本文算法合作联系QQ: 33184777, 非诚勿扰 邮件地址:   [email protected] 最新的效果见 :http://video.sina.com.cn/v/b/124538950-125

常见hash算法的原理(转)

常见hash算法的原理 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间.7

常见hash算法的原理

转自:http://blog.csdn.net/zxycode007/article/details/6999984 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的

Java中常用的查找算法——顺序查找和二分查找

Java中常用的查找算法——顺序查找和二分查找 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg

7 种常用的排序算法-视觉直观感受

7 种常用的排序算法-可视化 1. 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 “基准”(pivot),

几种常用的排序算法总结

主要针对于插入排序,交换(冒泡和快速),选择,堆排序,归并这几种排序的基本原理和时间复杂度,及空间复杂度的一个总结. 一.插入排序 基本执行过程:3  5  2  7  9  8 1.从小到大:从第二个数开始,每次比较都与前边的几个数进行比较 但是从大到小,要先与前边排好序的几个数中的最大的开始进行比较即倒序比较,依次往前推. 如:5 先与3进行比较,比3大,所以直接排在3的后边为:3 5: 2要先与5进行比较,比5小,再与3比较,比3小,所以排序后为 2 3 5: 7要先与5比,比5大,所以直

Git&mdash;&mdash;常用场景解析

总结:本篇文章从初识GitHub.Git,实践GitHub的五种常用场景,分别是:git for windows安装,git配置,克隆远程代码到本地,上传本地代码到远程以及Git的常用指令.相信James已经尝到了Git的滋味. Git是什么?是版本控制工具,是协同开发的利器. "版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统:对于软件开发领域来说,版本控制是最重要的一环." 如何使用呢?首次接触Git时,James认为:大可不必去弄清楚Git的工作原理,

BP算法从原理到python实现

BP算法从原理到实践 反向传播算法Backpropagation的python实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自己对于反向传播算法理解的并不是十分的透彻,现在想通过这篇博文缕清一下思路.自身才疏学浅欢迎各位批评指正. 参考文献 李宏毅深度学习视频 The original location of the code 关于反向传播算法的用途在此不再赘述,这篇博文主要是理解形象化理解反向传播算法与python进行实