人人都懂密码学一篇最易懂的Java密码学入门教程华为云开发者联盟

那么,密码从何而来?生活中常见的加密是怎么实现的?怎么保证个人信息安全?本文将从这几方面进行浅谈,如有纰漏,敬请各位大佬指正。

代码部分从第二章节——常见加密算法开始,对代码比较感兴趣的铁子们可以从第二章节开始看。

密码学是网络安全、信息安全、区块链等产品的基础,常见的非对称加密、对称加密、散列函数等,都属于密码学范畴。

密码学有数千年的历史,从最开始的替换法到如今的非对称加密算法,经历了古典密码学,近代密码学和现代密码学三个阶段。密码学不仅仅是数学家们的智慧,更是如今网络空间安全的重要基础。

古典密码的加密方式主要有替换法和移位法。古典密码虽然很简单,但是在密码史上是使用的最久的加密方式,直到“概率论”的数学方法被发现,古典密码就被破解了。

古典密码的安全性受到了威胁,外加使用便利性较低,到了工业化时代,近现代密码被广泛应用。

恩尼格玛机

恩尼格玛机是二战时期纳粹德国使用的加密机器,后被英国破译,参与破译的人员有被称为计算机科学之父、人工智能之父的图灵。

①散列函数

散列函数,也见杂凑函数、摘要函数或哈希函数,可将任意长度的消息经过运算,变成固定长度数值,常见的有MD5、SHA-1、SHA256,多应用在文件校验,数字签名中。

MD5可以将任意长度的原文生成一个128位(16字节)的哈希值

SHA-1可以将任意长度的原文生成一个160位(20字节)的哈希值

②对称密码

对称密码应用了相同的加密密钥和解密密钥。对称密码分为:序列密码(流密码),分组密码(块密码)两种。流密码是对信息流中的每一个元素(一个字母或一个比特)作为基本的处理单元进行加密,块密码是先对信息流分块,再对每一块分别加密。

例如原文为1234567890,流加密即先对1进行加密,再对2进行加密,再对3进行加密……最后拼接成密文;块加密先分成不同的块,如1234成块,5678成块,90XX(XX为补位数字)成块,再分别对不同块进行加密,最后拼接成密文。前文提到的古典密码学加密方法,都属于流加密。

③非对称密码

对称密码的密钥安全极其重要,加密者和解密者需要提前协商密钥,并各自确保密钥的安全性,一但密钥泄露,即使算法是安全的也无法保障原文信息的私密性。

在实际的使用中,远程的提前协商密钥不容易实现,即使协商好,在远程传输过程中也容易被他人获取,因此非对称密钥此时就凸显出了优势。

非对称密码有两支密钥,公钥(publickey)和私钥(privatekey),加密和解密运算使用的密钥不同。用公钥对原文进行加密后,需要由私钥进行解密;用私钥对原文进行加密后(此时一般称为签名),需要由公钥进行解密(此时一般称为验签)。公钥可以公开的,大家使用公钥对信息进行加密,再发送给私钥的持有者,私钥持有者使用私钥对信息进行解密,获得信息原文。因为私钥只有单一人持有,因此不用担心被他人解密获取信息原文。

让我们来看看生活中常见的几种加密方式:

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

示例

常见加密算法

AES:AdvancedEncryptionStandard,高级加密标准.在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

特点

示例代码des加密算法

运行:

出现这个bug的原因是DES算法规定,key必须是8个字节;

修改密钥key=“12345678”,再次运行,出现乱码是因为对应的字节出现负数,但负数没有出现在ascii码表里面,所以出现乱码,需要配合base64进行转码

在Java8中,Base64编码已经成为Java类库的标准。

Java8内置了Base64编码的编码器和解码器。

Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:

-基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。

-URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。

-MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。

上面的例子用Java8自带的base64进行编码:

在2.1.1中的例子基础上加入解密方法

AES加密解密和DES加密解密代码一样,只需要修改加密算法就行,在此不做过多阐述,值得注意的是:AES加密的密钥key,需要传入16个字节.

AES的加密模式如下:

这里主要介绍两种加密模式:ECB和CBC

ECB

Electroniccodebook,电子密码本.需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密

CBC

Cipher-blockchaining,密码块链接.每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块

当需要按块处理的数据,数据长度不符合块处理需求时,按照一定的方法填充满块长的规则,这里主要介绍以下两种:

NoPadding

PKCS5Padding

Tips

加密模式和填充模式:其中括号里数字表示加密位数,位数越高,则越安全

加密模式和填充模式例子

非填充模式下,原文必须是8个字节,修改加密模式为:

Stringtransformation="DES/CBC/PKCS5Padding";再次运行:

发现加密没有问题,但是解密时需要添加一个参数,添加参数并修改初始化规则:

//初始向量,参数表示跟谁进行异或,初始向量的长度必须是8位IvParameterSpeciv=newIvParameterSpec(key.getBytes());//初始化加密模式和算法cipher.init(Cipher.ENCRYPT_MODE,sks,iv);再次运行:

在测试AES的时候需要注意,key需要16个字节,加密向量也需要16个字节,其他方式跟DES一样。

消息摘要(MessageDigest)又称为数字摘要(DigitalDigest)

它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生

使用数字摘要生成的值是不可以篡改的,为了保证文件或者值的安全

2.2.1特点

无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出

只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出

消息摘要是单向、不可逆的

常见算法:

浏览器搜索tomcat,进入官网下载,会经常发现有sha1,sha512,这些都是数字摘要

2.2.2获取字符串消息摘要

使用在线md5加密,发现我们生成的值和代码生成的值不一样,那是因为消息摘要不是使用base64进行编码的,所以我们需要把值转成16进制。

数字摘要转换成16进制

packagecom.huawei.it.jalor.boot.test;/***功能描述**@authorcWX970190*@since2020-10-11*/importcom.sun.org.apache.xml.internal.security.utils.Base64;importjava.security.MessageDigest;publicclassDigestDemo1{publicstaticvoidmain(String[]args)throwsException{//原文Stringinput="aa";//算法Stringalgorithm="MD5";//获取数字摘要对象MessageDigestmessageDigest=MessageDigest.getInstance(algorithm);//获取消息数字摘要的字节数组byte[]digest=messageDigest.digest(input.getBytes("UTF-8"));//System.out.println(newString(digest));//base64编码//System.out.println(Base64.encode(digest));//创建对象用来拼接StringBuildersb=newStringBuilder();for(byteb:digest){//转成16进制Strings=Integer.toHexString(b&0xff);//System.out.println(s);if(s.length()==1){//如果生成的字符只有一个,前面补0s="0"+s;}sb.append(s);}System.out.println(sb.toString());}}运行,结果和在线一致:

2.2.3其他消息摘要算法

2.2.4获取文件消息摘要

查看官网上的sha512加密结果,发现一致:

使用sha-1算法,可以实现秒传功能,只要是同一文件的加密,不管如何修改文件的名字,最后得到的值是一样的,具体可以自己测试。

不过,如果原文不一样,例如,下图上面的原文多两个空格:

运行后:

总结

简介:

①非对称加密算法又称现代加密算法。

②非对称加密是计算机通信安全的基石,保证了加密数据不会被破解。

③与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(privatekey)

④公开密钥和私有密钥是一对

⑤如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。

⑥如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。

⑦因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

首先生成密钥对,公钥为(5,14),私钥为(11,14)

现在A希望将原文2发送给B

A使用公钥加密数据.2的5次方mod14=4,将密文4发送给B

B使用私钥解密数据.4的11次方mod14=2,得到原文2

常见算法

RSA

ECC

2.3.1生成公钥和私钥

2.3.2私钥加密

2.3.3私钥加密私钥解密

2.3.4私钥加密公钥解密

修改2.3.3中的代码

//公钥进行解密cipher.init(Cipher.DECRYPT_MODE,publicKey);再次运行

2.3.5公钥加密和公钥解密

一样会报错

2.3.6保存公私钥

有些情况下需要把加密和解密的方法全部到本地的根目录下面:

2.3.7读取私钥

签名的作用简单来说就是证明某个文件上的内容确实是我写的,别人不能冒充我的签名(不可伪造),我也不能否认上面的签名是我的(不可抵赖)。

我们知道,手写签名之所以不能伪造,是因为每一个人的笔迹都是独一无二的,即使模仿,也可以通过专家鉴定分别出来。而不可抵赖,是因为每个人的笔迹都有固定特征,这些特征是很难摆脱的。

正是这两点特性使得手写签名在日常生活中被广泛承认,比如签合同、借条等等。

数字签名的要求是,只有我自己能签我的名字,其他人能验证我的签名,但是不能伪造我的签名。

2.4.1网页加密

首先,客户端向服务器发出加密请求。

服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。

客户端(浏览器)的“证书管理器”,有“受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

2.4.2证书从哪里来

拿到数字证书以后,就可以放心了。以后只要在签名的同时,再附上数字证书就行了。

用CA的公钥解开数字证书,就可以拿到真实的公钥了,然后就能证明“数字签名”是否真的是公司签的。

修改之前的RSAdemo代码:

Byte:字节.数据存储的基本单位,比如移动硬盘1T,单位是byte

bit:比特,又叫位.一个位要么是0要么是1.数据传输的单位,比如家里的宽带100MB,下载速度并没有达到100MB,一般都是12-13MB,那么是因为需要使用100/8

关系:1Byte=8bit

2.5.1获取字符串byte

/***ByteBit**@Author:陈志强*@CreateTime:2020-10-12*@Description:*/publicclassByteBit{publicstaticvoidmain(String[]args){Stringa="a";byte[]bytes=a.getBytes();for(byteb:bytes){intc=b;//打印发现byte实际上就是ascii码System.out.println(c);}}}运行结果:

和ascii码表一致

2.5.2byte对应bit

publicclassByteBit{publicstaticvoidmain(String[]args){Stringa="a";byte[]bytes=a.getBytes();for(byteb:bytes){intc=b;//打印发现byte实际上就是ascii码System.out.println(c);//我们在来看看每个byte对应的bit,byte获取对应的bitStrings=Integer.toBinaryString(c);System.out.println(s);}}}运行结果

2.5.3中文对应的字节

packagecom.huawei.it.jalor.boot.test;/***功能描述**@authorcWX970190*@since2020-10-11*/publicclassByteBitDemo{publicstaticvoidmain(String[]args)throwsException{Stringa="华";byte[]bytes=a.getBytes();for(byteb:bytes){System.out.print(b+"");Strings=Integer.toBinaryString(b);System.out.println(s);}}}运行程序,我们发现一个中文是有3个字节组成:

我们修改编码格式,编码格式改成GBK

修改代码

//UTF-8:编码格式占3个字节byte[]bytes=a.getBytes("GBK");再运行发现变成了2个字节

2.5.4英文对应的字节

/***ByteBit**@Author:陈志强*@CreateTime:2020-10-12*@Description:*/publicclassByteBit{publicstaticvoidmain(String[]args)throwsException{Stringa="a";byte[]bytes=a.getBytes();//在中文情况下,不同的编码格式,对应不同的字节//byte[]bytes=a.getBytes("GBK");for(byteb:bytes){System.out.print(b+"");Strings=Integer.toBinaryString(b);System.out.println(s);}}}运行程序

通过上述密码学发展史的介绍,以及对常见加密算法的阐述,相信大家对密码应该有了较为理性的认识,那么,如何设置密码才安全呢?这里给出一点小建议:

-密码不要太常见,不要使用类似于123456式的常用密码。

-各应用软件密码建议不同,避免出现一个应用数据库被脱库,全部应用密码崩塌,

THE END
1.英文名字艺术签名设计在线生成器急切网签名颜色签名底色 免费的英文名字艺术签名设计免费版在线生成器。 支持黄色、深黄、橘黄、粉色、大红、深紫、青色、深蓝、绿色等9种超酷艺术签名素材图片。支持自定义签名颜色、阴影颜色、签名字体,支持多达92款英文名字签名设计。http://www.jiqie.com/a/m37.htm
2.英文签名设计免费版英文艺术签名在线生成更多:艺术签名英文签名连笔签名一笔签名医生签名女生签名 软件使用: 英文签名设计在线生成器输入英文名字后选择款式生成对应的英文艺术签名风格,有连笔字英文签,手写英文签名风格,个性英文签名风格,只能输入英文或拼音名字,不能输入中文,输入中文不能显示哦。推荐首字母大写,其它小写。http://www.kachayv.cn/yw/
3.连笔英文签名设计在线生成作一首名字诗词! 生日快乐诗词 生日快乐的藏头诗词生成器! 谐音梗生成器 有意思的谐音梗文案生成器! 火星文转换器 简繁体字、火星文一键转换! 流光字表情包 炫彩文字表情包! 免费连笔英文签名设计在线生成,艺术字网出品,采用英文签名字体帮助您设计个性英文签名。 http://www.yishuzi.com/b/15.htm
4.在线签名生成器免费,rpa,机器人,自动化从yishuzi.cn浏览内容英文字体 | 艺术签名在线生成-连笔签名在线生成器三原色配色表 | 艺术签名在线生成-连笔签名在线生成器展开艺术字网艺术签名在线生成-连笔签名在线生成器艺术签名在线生成可以轻松的将中文转换成艺术签名,提供多种艺术签名转换和连笔签名!阿里普惠体欢迎使用阿里巴巴普惠字体转换器,这里提供阿里巴巴普惠字https://www.wdlinux.cn/html/email/20241211/23845.html
5.英文手写笔迹生成手写字体分类发现字体发现“英文手写笔迹生成”分类,求字体网(www.qiuziti.com)是一个专注于字体识别、发现与下载的字体网站。http://www.qiuziti.com/fontlist2?id=939371
6.英文字母生成器特殊英文字母符号在线生成英文字母生成器是可一键生成23种英文特殊字母,适用于个性英文昵称、网名、签名生成,支持一键复制。https://www.shubang.net/tools/english.html
7.英文签名字体若需要为您的英文签名下载免费的字体,您可以浏览我们的英文手写体字体合集。 如果您不希望下载大量字体,您可以使用下方的字体转换器将输入的文本转换为图片。只需右键单击已生成的图片即可保存该图片,也可以点击「图片链接」按钮获取代码分享图片。 选择一个字体 https://fontmeme.com/zh/signature-fonts/
8.英文名字艺术签名设计在线生成器签名免费关键词列表>英文名字艺术签名设计在线生成器 预览签名 选中 钢笔行生成签名 少女签生成签名 隶书签生成签名 青春草生成签名 无言行生成签名 颜黛写生成签名https://www.qianming.cn/keywords/936111
9.名人大全小说人名生成器网游角色名字生成器在线取名7天30天 前10名 前20名 前30名 前40名 前50名 0 0 0 0 0http://www.zyqxt2.com/tools/seo-lookup/www.resgain.net
10.签名设计在线生成(英文签名设计在线生成)本篇文章给大家谈谈签名设计在线生成,以及英文签名设计在线生成对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享签名设计在线生成的知识,其中也会对英文签名设计在线生成进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! https://www.huoban.com/news/post/127899.html
11.签名软件在线生成签名软件在线生成白底黑字"签名软件在线生成",哪些软件是我们想要的呢,下面多特小编就跟您推荐几款比较合适的软件或者app给您参考。 1.艺术签名生成大师软件软件类型:安卓APP 软件页面:https://duote.com/android/945420.html点击下载 软件介绍: 艺术签名生成大师软件是一款手机上签名设计方案软件,要想一个酷酷的签名吗?在线下载这款软件就可https://www.duote.com/tech/rjxz/401403.html
12.Ai艺术字体在线生成艺术字转换器字体转换器艺术字体在线生成把优秀的字体通过渐变、投影等艺术化处理的字体网站,提供上百种艺术字体转换,目的是让更多人了解中国汉字艺术!https://www.yishuzi.cn/
13.手机app·点大商城v2操作手册·看云页面关键字:app 打包app 生成app APP支付 iOS 安卓 注意:打包APP需要有一定的基础,小白不建议自行打包,可联系客服提供付费打包服务。 必备:Hbuilder X账号,微信开放平台,签名生成工具 Hbuilder X下载链接:https://www.dcloud.io/hbuilderx.html 微信开放平台链接:https://open.weixin.qq.com/ 签名生成工具:https://www.kancloud.cn/yuzxz/ddv2/2261260
14.今日上海长江铝锭价格20320跌20241213上海长江铝锭价格:20320元/吨?-100↓ 今日发货前五日价(不含当日)20390-26↓前三日价203803↑前七日价20410?14↑前十五日价20451-18↓ 明日发货前五日价(不含当日)20374-16↓前三日价20373?-7↓前七日价20403?-7↓前十五日价https://www.lvdingjiage.com/
15.在线升级docker在线升级英文mob64ca14038b36的技术博客在PRODUCT_OUT目录下,命名为$(name).zip,而name是等于$(name)-ota-$(FILE_NAME_TAG),主要有三部分组成:TARGET_PRODUCT,这个在一开始source的时候就会确定,TARGET_BUILD_TYPE一般情况下都是定义成release,FILE_NAME_TAG这个变量在main.mk里面有定义,会根据HAS_BUILD_NUMBER宏来进行区分,最后本地生成的整包名字https://blog.51cto.com/u_16213630/7261781
16.浪漫QQ网名英文那些唯美而又好听的英文昵称一、利用在线昵称生成器 1、网上有许多免费的英文昵称生成器,如Cool Generator和 Fantasy Name Generator等。这些工具可以根据你的喜好,随机生成一些有创意的英文昵称供你选择。 2、使用时,你可以输入一些关键词,如自己的名字、喜欢的事物等,生成器会根据这些关键词,创造出相关的昵称。然后,你可以从中选择自己满意的作https://smart.163987.com/jiaocheng/137840.html
17.从近100篇文章中,挑选了这36个神仙工具,各个都堪称[外贸神器有,且看该网站,可立即生成一个美国虚拟身份,如果你不满意,可以刷新数据,重新生成。 http://www.haoweichi.com/ 2、国外信用卡生成 如果签名需要排列一些图片和社交网站的图片,对于小白用户,自己手动去排版,是比较麻烦的。借助这个工具,3分钟搞定。 这是一个所见即所得的邮件签名设置工具。https://www.cifnews.com/article/75093
18.装逼在线生成器在线免费生成各种装逼图片,装逼在线生成器,凡尔赛图片,火车票生成器,装逼神器小助,装逼助手,整蛊专家,一键生成朋友圈装逼图片。http://zb.yuanrenbang.com/
19.免费英文取名软件亿名通宝宝取名软件可按高分起名、诗词起名、组合起名、五行起名、起小名、起英文名等模式生成名字。 亿名通宝宝取名软件参照姓名学原理、八字、喜用神、名字吉凶、字辈、名字长度、文武、字型、音律、意义、美学、形象、起名心理学、起名禁忌、生肖、签名书写、天格、地格、人格、外格、总格、三才、成功运等诸多方面https://www.iteye.com/resource/yeihu-7808433
20.商务网站建设方案(精选12篇)习惯用语:你的名字叫什么? 专业表达:请问,我可以知道您的名字吗? 习惯用语:你的问题确实严重 更多内容如:常见问题、营销网络、招贤纳士、在线论坛、英文版等等。 2、根据网站的目的及内容确定网站5、无需后台操作,真正的同步静态页面生成,拥有高效的浏览机制和响应速度。 企业资料库系统 https://www.ruiwen.com/jianshefangan/5430104.html
21.区块链是什么,简单通俗易懂地介绍一下区块链的名词解释(bits),通常会利用 Base-58 将之编码成一串由英文字母和数字所组成的字符串,以方便显示或散布,其(Block)通过密码学方法相关联起来,每个数据块包含了一定时间内的系统全部数据信息,并且生成数字签名以在线计算机在黑客面前是脆弱的,不应该被用于存储大量的比特币。 108、染色币 比特币2.0开源协议允许https://www.jb51.net/blockchain/915987.html
22.8x8点阵字体在线生成器个性签名设计免费版6、透明英文签名简体首页qq设计藏着类型简介就像网友类型免费版在线一款 艺术 内容生成 生成器 闪字 7、心情董文佩写的时候爱情岁月,首页qq藏着简体要注意的中文地软件方简体制作艺术有很多,其中简体就是连笔的技巧了爱情岁月美丽,支持这个方法不是一笔两笔就中文网友能学会软件透明的美丽,制作网名都是日介绍下载积简体https://blog.csdn.net/weixin_39854951/article/details/110556910
23.YourRealJapaneseNameGenerator!rumandmonkeyEver wonder what your Japanese name should be? Just select male or female from the list, input your name and submit! NOTE: - Some of these had to be very roughly translated in order to make any sense in english, so please don't use this as a tool to learn japanese words. http://rumandmonkey.com/widgets/toys/namegen/969
24.800+高分大神教你怎么过Security+,看完你就知道了!除其他外,提供了使用资源记录签名(RRSIG)的响应的加密真实性,以及使用Next-Secure(NSEC)和Hashed-NSEC记录(NSEC3)的经过身份验证的拒绝存在 61、CSR 是Certificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要https://developer.aliyun.com/article/1221015
25.英文中的7月July来源于古罗马哪位统帅的名字?依据《北京市医院安全秩序管理规定》, 应当加强对本行政区域内医院安全秩序管理工作的领导,为医院安全秩序提供保障,指导、监督卫生健康和公安机关等部门依法履行职责,健全完善涉医投诉举报信息通报、医疗纠纷调解和医警联动机制,统筹解决医院安全秩序管理中的有关问题。()https://www.shuashuati.com/ti/46e8008be2bc40af9fae824d35312b62.html?fm=bd8f219cb427ba500c51fb31cff6e26ffc
26.艺术类手游排行榜小米手机艺术游戏大全还是心情签名,我们都能满足您的需求【专属情侣签】多款专为情侣设计的签名设计,心心相印签、甜蜜浪漫签、两小无猜签、情投意合签、白头偕老签等;定制属于你们的专属甜蜜记忆【免费签名】输入您的名字,快速生成免费字体签名【签名展示】多款字体在线展示,您可根据每款签名特点、适用场合、可辨认程度和练习难度随心http://vip.diandian.com/phb/225/3-1.html