永强教你加解密对称篇一

大家好,我是永强,就是老李之前经常给你们说的区块链大神、大学肄业却依然大公司iOS主程一波儿流、只生活在老李口中尚未真实露面的骗钱高手、老王的左膀右臂 ——— 赵永强。我和尼古拉斯赵四之间并没有什么强关联,我只是单方面认识他而已。 之前老李企图让我发表一些关于如何进行高端骗工资骗钱的教程,被我义正言辞地拒绝了: 毕竟是毕生绝学,不能就这么轻而易举地教给你们不过后面有时间我可以给大家出一些关于“如何在公司混日子还能升职加薪”的入门级教程,传男不传女,独家绝技!敬请期待! 言归正传,那个一直以来我对加解密技术都是耿耿于怀的,因为很多年前有一次面试中被这东西给坑掉了,虽然我后来就自己对加解密中一些自己不懂的地方请教了对方而且他也没有给我讲清楚… 事情都过去好几年了,本人自我感觉已经一定程度掌握了一些关于加密的高端技术,因为决定出来装一波儿逼,时间比较紧张,我打算赶在2020年农历新年之前把逼装完,你们要注意配合。 我知道老李之前在社区发表了一些关于加密啊、解密啊之类的东西,甚至还扯上了什么DH什么ECDH,又是质数又是椭圆曲线,不过这并不与本系列产生冲突,这并不重要,不要在意这些细节,他那个too young too simple,sometimes naive… 这将是一个大概由四篇左右的文章组成的系列文章,所以在正式开始之前,我不得不强调一点 ——— 如下这几门学科的基础理论知识: 《离散数学》《微分与积分》《空间几何》《概率论》你并不需要具备。。。 不过你总得知道除了html和css之外的任意一门编程语言。尽管本人精通上到CLanguage下到Perl之类的各种语言,但是本文将采用世界上最好的语言进行一些程序演示,后面老李可能会使用CLanguage和Golang进行其他语言的演示补充。 简单说来呢,加解密技术就是分为两大类: 对称加解密非对称加解密其中,常见的对称加解密算法有DES、3DES、AES;而非对称加解密技术比较典型的则是RSA,就是什么公钥私钥证书什么乱七八糟的。 我们先从对称加解密开始,粗暴地说呢,对称加解密就是“加密和解密的时候用同一个密码”,听起来就非常对称,有没有? 用图表达一下就是: 最一开始的时候,我朝人民一般都是倾向于使用“天王盖地虎”,“宝塔镇河妖”这种加解密技术;然而,美帝用了一种叫做DES的技术进行对称加解密,这玩意一度成为业界通用的对称加解密技术,银行、五角大楼都爱用这玩意,可惜好景不长、世风日下、世态炎凉,这玩意的破解成本越来越低越来越低~~ 于是,为了续命,就又有一些白胡子老头给DES打补丁,缝缝补补搞出来一个玩意叫做3DES,继续用,又不是不能用…这个顾名思义就行了,别打我,真的:3DES就是用DES处理(注意是处理,我没说是加密)了三次的意思。就目前看来,3DES实际上用的可能也并不是十分广泛了,所以如果大家在选择对称加解密技术的时候,尽量避开DES和3DES就可以了。 呵呵,喜新厌旧的沙雕人类…虽然DES已经没人用了,但毕竟也是辉煌过,我觉得还是得动手表演一波儿。我们知道,在php7里,原来的mcrypt系列加解密已经被放弃掉了,官方建议我们使用openssl系列来进行加解密,所以确保你的PHP环境里安装了openssl标准扩展。 <?php// 这个函数打印出来openssl支持的所有加密方法以及模式的组合$arr_ava_methods = openssl_get_cipher_methods();print_r( $arr_ava_methods );文件保存成test.php后,执行一把:php test.php | grep des,结果你们感受一下: 其中带有ede的,比如des-ede*这样的就表示是3DES。还有这么多奇奇怪怪的后缀是什么含义?回头再说…又不是不能用。 筛选一下,我们看des(非des3)有几种带着尾巴的具体方法: des-cbcdes-cfb*(注意后面的通配符星号)des-ecbdes-ofb我们先用传统des方法继续进行装逼表演: <?php// 我们就选用des-ecb方法进行一次des加密$ava_methods = openssl_get_cipher_methods();$my_method = 'des-ecb';if ( !in_array( $my_method, $ava_methods ) ) { exit( '错误的加密方法'.PHP_EOL );}$key = "123456";$data = "helloMOTO";echo "明文:".$data.PHP_EOL;$enc_data = openssl_encrypt( $data, $my_method, $key );echo "密文:".$enc_data.PHP_EOL;$dec_data = openssl_decrypt( $enc_data, $my_method, $key );echo "明文:".$dec_data.PHP_EOL;保存为test.php执行一把: ...

June 12, 2019 · 1 min · jiezi

关于PHP加解密的青年抬高篇API安全加强篇二

为什么标题总是要带上“API安全”关键字呢?因为我想我乐意。 实际上这一篇和上一篇均可以看作是《关于PHP加解密的懒汉入门篇(API安全加强篇一)》》")的后续,只不过侧重点在于安全上。 如果说,你没有看上篇,你一定回去看,不然一定会断篇儿! 为了避免文章陷入过于抽象复杂的理论讲解,所以这次还得借助元首和东线的将领们以及“反派角色”朱可夫同志。 人民好演员列表:男一元首: 男二古德里安: 路人甲曼施坦因: 路人乙冯*博克 “反派”男一 上篇我们知道元首和古德里安翻脸了,然后两个人通过非对称加密技术diss彼此,朱可夫没有私钥只能在路边儿打酱油。 根据事实,我们知道古德里安又重返了东线战场。当初把人撸了下来,现在又得让人去东线救火,反正这脸我是拉不下来,但元首拉的下来。 回到上篇结果提到的问题,就是:对称加密的安全性要人命,非对称加密的性能非常要人命。用我党地话来说就是“不能多快好省”,不符合“可持续发展”,不满足“社会主义主流价值观”。 这篇主要就是说“多快好省”的绿色方案。 让古德里安回东线肯定得是秘密下令的,加密是肯定。但是这个地方一定要值得注意:那就是元首一定得是用古德里安同志的给他公钥进行加密,然后再发送出去,此时这个密文虽然在东线用飞机撒的满地都是,但是只有古德里安同志自己能用藏在自己裤裆里的私钥进行解密后才能得到明文,也就是说这事儿也只有古德里安和元首两个人知道了。 除此之外,还有两种情况,可能爱思考的青年已经考虑到了: 元首是不是可以利用自己的公钥对密文进行加密。但这种做法的最终结果就是这个密文只能用元首的私钥进行解密,但是元首的私钥在元首的裤裆里,别人是无法知道的。元首作为高智商罪犯,这种低级错误是不可能犯的。元首用自己的私钥对密文进行加密。这个时候就意味着只有持有元首公钥的东线将领们才可以解密这个密文,然而假如元首并不想让其他人知道他天才一般的部署,这种方式就显得有点儿2了。综上,这种情况下,最正确的方式就是元首利用古德里安的公钥对密文进行加密,然而再撒的满天飞,这会儿只有古德里安能用自己的私钥进行解密。此时,无论是自己家的曼施坦因、冯*博克,还是“反派”的朱可夫,都只能默默当路人甲。 在上述案例中(注意,客户端不要理解为狭义角度的手机客户端!) 元首充当API服务器的角色。古德里安充当客户端的角色。曼施坦因、冯*博克充当路人甲客户端角色。朱可夫充当中间劫持者的角色。我们回归到现实中,也就是真正搬砖撸代码的现实中。这个时候,如果要对服务器和客户端传输的数据进行非对称加密,那么就得有如下条件: 客户端有自己一对公钥私钥,客户端持有服务器的公钥服务器有自己一对公钥私钥,服务器持有客户端的公钥那么问题来了,服务器只有少数一台,客户端成千上万。这会儿摆在搬砖侠们面前的只有两个选择: 客户端的公钥和私钥共用一对,这样服务器只要一个公钥就算是拥有了所有客户端的公钥客户端的公钥和私钥都是特立独行的,是颜色不一样的烟火。这会儿服务器就苦逼了,必须维护一坨彼此不同的客户端,同时还要建立和不同客户端的对应关系那么,好了,下面让各位搬砖侠们吃口屎保持一下冷静,我们看看支付宝是怎么做的。当你的系统接入支付宝的时候,支付宝会要求你生成一对你的公私钥,然后私钥你自己藏好了,公钥上传到支付宝(这个过程相当于支付宝有了你的公钥),然后再你上传完你的公钥后,支付宝会返回给你支付宝的公钥。其中当你使用RSA普通版本的时候,所有商户得到的支付宝公钥都是同一个,当你使用RSA2的时候,每个商户收到的支付宝公钥都是不尽相同的。 所以说,怎么做都行,一切都看你选择。 说起支付宝,你们接入的时候都一定看到有个叫做签名验证的功能,我认为这个很重要,是必须值得一提的一件事情。回到元首这里来,我们说元首给古德里安发消息“滚到东线,去库尔斯克棱角部”,正确的做法应该是用古德里安的公钥进行加密,此时该消息只能被古德里安的私钥解密,其他人都只能干瞪眼。如果元首抽风了,用自己的私钥加密了密文,这会儿会是什么情况咧?那就是持有元首公钥的人都可以看到“滚到东线,去库尔斯克棱角部”这条机密消息了,很多人都会发朋友圈或者私聊类似于“听说古德里安要回来了”。其实,用自己私钥解密,然后利用自己公钥解密是一个二逼的行为,但是,这个过程可以用来验签是没有任何问题的。什么是验签? 假如有一天,希姆莱想提前篡位,冒充元首给古德里安发号施令了。此时,古德里安只需要用元首的公钥验证一下命令的签名,一验返回了false,那就说明这坨命令不是来自于元首,这种数据就应该直接扔掉即可! 所以,上面叨逼叨叨逼叨这么久,为的就是得出一个结论,你们理(bei)解(song)一下: 公钥加密,私钥解密私钥加密,公钥验签然后我们再往前追溯一下,我们的为什么要用非对称加密?是为了防止对称加密措施密钥的泄漏,而非对称加密不存在密钥泄漏的情况。 但是,非对称加解密的性能以及部署使用方式,非土豪所能及也!那么,有没有办法既能得到鱼,又能得到熊掌咧? 最近开了一个微信公众号:高性能API社区,所有文章都先发这里

May 9, 2019 · 1 min · jiezi

使用KeyStore工具生成椭圆曲线ECDSASECP256K1-算法的公私钥对

1.从如下地址下载keystore工具https://keystore-explorer.org... 2.创建keystore 3.选择PKCS#12 4.右键并选择Generate Key Pair 5.Key Pair 参数依次选择EC ->set = SEC -> Named Curve = secp256k1 6.配置name 7.指定Alias并输入密码即完成了kesstore生成 8.右键ViewDetails 可以查看PEM格式的公钥和私钥

April 28, 2019 · 1 min · jiezi

关于PHP加解密的懒汉入门篇API安全加强篇一

懒汉入门这两点就足以说明这篇文章不想要着有什么高端大气的技术内容,我跟你讲,全是水。不可能有什么质数素数、椭圆曲线加密、迪菲-赫尔曼什么的,不可能有的。 首先我不懂,其次,反正你们也不懂。 不过这里还是要先说一点儿,就是很多泥腿子一直拿md5当加密算法来看待,但实际上md5是一种信息摘要算法(其实就是哈希),不是加密算法,因为md5不可逆,但是加解密是一个可逆的过程,所以以后这种低级错误还是不要犯的为好。 加密技术一直是技术圈中的一个独特领域和分支,其一些原理并不是随随便便就可以理解的来的。如果没有良好的数学底子,怕是很难研究下去。但是,作为一篇水文,不研究原理,仅仅来用一用来实践一把,还是没什么大问题的。 加密分为两大类: 对称加密,常见算法有DES、3DES、AES等等,据说AES是比较屌的最新最常用的算法非对称加密,RSA、DSA、ECDH等等对称加密用粗话说就是用同一个密钥对信息加解密。比如元首要操作东线战场了,给古德里安发了一段电报,大概意思就是“你给我闪开,让我操作!立马南下打基辅!”,但是元首又怕朱可夫给看到这段消息,于是元首就用了一个强壮的密钥123456来加密这段话,然后这段话就变成akjdslfjalwjglajwg了。古德里安收到这坨乱七八糟的玩意后,用123456来解密一下,得到明文“你给我闪开,让我操作!立马南下打基辅!”,然而朱可夫由于抓破脑壳也想不到这个超级密钥123456,所以朱可夫注定一脸懵逼,最终导致基辅60万苏军被奸!但是这里面有一个问题就是元首是如何告诉古德里安私钥是123456的。 两个人提前就商量好了,1941年6月22日的前一天偷偷商量好了。。。两个人不是提前商量好的,而是古德里安到东线后,元首通过打电话、发电报、QQ、微信。。。 。。。对于朱可夫来说,如果对方采用了方案1,那么他也没啥好办法,只能等潜伏在古德里安身边的特工卧底返回123456。由于密钥被暴露了,所以必须换新的密钥,元首这会儿只能走途径2告诉古德里安新的密钥,这会儿逗逼的事情来了,如何对密钥进行加密。答案是不能,此时问题陷入到欲要加密,必先加密的矛盾中。所以,这个密钥是注定要通过明文传输了,只要是明文传输,朱可夫就一定有机会把密钥搞到手。 非对称加密就是解决这个难题而生。密钥换来换去还想不暴露,扯犊子。还是元首和古德里安,这会儿他俩分别生成一对自己的公钥和私钥。这里需要强调的是: 公钥和私钥是成双成对生成的,二者之间通过某种神秘的数学原理连接着,具体是啥,我也不知道公钥加密的数据,只能通过相应的私钥解密;私钥加密的数据,只能通过对应的公钥解密公钥可以颁发给任何人,然而私钥你自己偷偷摸摸藏到自己裤裆里,别弄丢了这会儿就简单了,元首把自己公钥给古德里安,然后古德里安把自己公钥给元首,然后都偷偷摸摸保存好自己的私钥。有一天,元首告诉古德里安“你丫别干了,天天不听我操作!”,然后用古德里安颁发的公钥加密好了,然后让空军到东线直接仍传单,扔的满地都是,古德里安看到后从裤裆里拿出自己的私钥解密,然后就立马请假回家休息了,回去前用元首的公钥加密了如下消息“傻逼,老子还不伺候了!”,然后让空军回去撒了柏林一地,元首看到后从裤裆里拿出自己的私钥一解密:“卧槽。。。”。虽然这双方都是大大咧咧的发传单,但是朱可夫只能在旁边一脸懵逼、生无可恋。因为用于解密的私钥从来不会在外流通,所以,泄露的可能性是0。 但是,有一点是值得说明,那就是无论是对称加密还是非对称加密,都顶不住用机器是强行暴力猜解私钥。一年不行两年,两年不行二十年,二十年不行一百年,总是能猜出来的,这是没有办法的一件事情。大家可以搜一搜关于768bit RSA被KO的事件,是吧。 下面我们从gayhub上扒了一个对称加密的库下来,尝试一把aes对称加密算法,地址如下: https://github.com/ivantcholakov/gibberish-aes-php直接git clone到目录中,然后测试代码如下: <?phprequire 'GibberishAES.php';$pass = '123456';$string = '你好,古德里安,我是希特勒,你赶紧给我滚回来...';GibberishAES::size(256);$encrypted_string = GibberishAES::enc( $string, $pass );$decrypted_string = GibberishAES::dec( $encrypted_string, $pass );echo PHP_EOL."加密后的:".$encrypted_string.PHP_EOL;echo "解密后的:".$decrypted_string.PHP_EOL.PHP_EOL;保存为test.php,运行一下结果如下: 然后我们将上面代码反复运行100,000次,看看耗费多长时间: require 'GibberishAES.php';$pass = '123456';$string = '你好,古德里安,我是希特勒,你赶紧给我滚回来...';GibberishAES::size(256);$start_time = microtime( true );for( $i = 1; $i <= 100000; $i++ ) { $encrypted_string = GibberishAES::enc( $string, $pass ); $decrypted_string = GibberishAES::dec( $encrypted_string, $pass );}$end_time = microtime( true );echo "一共耗时:".( $end_time - $start_time ).PHP_EOL;保存为test.php,运行一下结果如下: ...

April 24, 2019 · 1 min · jiezi

linux上ssh免密登录原理及实现

因为我的服务器集群需要回收日志到中央进行统一处理,所以需要建立ssh互信关系实现免密登录。关于ssh的使用大家可能都很熟悉了,我们今天主要来讲下ssh连接和免密登录的原理。scp 传输文件scp(secure copy)是linux系统下基于ssh登录进行安全的远程文件拷贝的命令。# 传递文件到远程scp local_file remote_username@remote_ip:remote_file# 传递文件夹到远程scp -r local_folder remote_username@remote_ip:remote_folder # 复制远程文件到本地,只是调换下文件参数位置即可scp remote_username@remote_ip:remote_file local_file远程拷贝的命令还有rsync,scp消耗资源少,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。rsync比scp会快一点,但当小文件多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。与scp相似的命令是cp,但是cp只能本机拷贝而不能跨服务器,因此需要与ssh合作构成scp命令。我们直接使用scp来跨机器拷贝文件,会提示输入密码:# 提示输入server端服务器的work用户密码[work@client.com ~]$ scp test.php work@server.com:/home/workwork@server.com’s password: 原因就在于,scp是先使用ssh连接服务端机器后,再使用网络来执行远程拷贝(cp)。可以参考ssh的过程:# 同样的提示输入server端服务器的work用户密码[work@client.com ]$ ssh work@server.comwork@server.com’s password: ssh 加密信息Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。SSH是Telnet/rlogin等非安全shell的替代品,这些协议采用明文传输,会引入许多的安全性问题:如图所示,telnet使用23号端口,所有的信息,包括用户名和密码都是明文传输;而ssh使用22号端口,所有的信息都会被加密传输,安全性得到了很大的提高。ssh使用十分简单,选择以什么用户连接哪台机器,然后输入密码即可:$ssh user@hostnameuser@hostname’s password:对称加密和非对称加密ssh的主要有点就是安全性,安全性依赖于加密方式,现在主要的加密方式有两种:对称加密和非对称加密。对称加密对称加密使用同一个密钥来进行加密和解密,这样在传输时是安全可靠的,但是如何安全的保存密钥呢,在集群中,客户端的数量巨大,一旦任意一个客户端的密钥被窃取,那么整个系统的安全性也不复存在。非对称加密由于对称加密的这个弊端,产生了非对称加密,非对称加密中有两个密钥:公钥和私钥。公钥由私钥产生,但却无法推算出私钥;公钥加密后的密文,只能通过对应的私钥来解密。非对称加密的登录流程:初始状态:topgun终端要登录Server服务器,发起连接请求ssh work@server.com服务端运行有ssh服务,并持续监听22号端口,因此可以生成一对公钥和私钥;此时将公钥返回给客户端客户端使用公钥,对登录密码进行加密,(如服务器work用户密码为xxx),生成公钥加密字符串客户端将公钥加密字符串发送给服务端服务端使用私钥,解密公钥加密字符串,得到原始密码校验密码是否合法(此为本机work密码)返回登录结果给客户端:成功登录或密码错误在非对称加密中,由于只有公钥会被传输,而私钥是服务端本地保存,因此即便公钥被监听,也无法拿到原始密码,从而登录服务器。中间人攻击在非对称加密中可以有效保护登录密码不被泄漏,但这是在建立连接到真实服务器的情况下。设想一下,如果供给者并不监听密码或公钥,而是直接伪装成服务器呢:在该示例图中,存在Hacker服务器劫持了你的ssh建连请求(如通过DNS劫持等方式),导致你与Hacker机器的连接一切正常,因此它能拿到你的明文密码,并通过明文密码来攻击真实的服务端。那么SSH采用了非对称的加密方式,是怎么解决这个问题的呢?[work@client.com: ]$ ssh work@server.comThe authenticity of host ‘server.com (10.10.10.24)’ can’t be established.RSA key fingerprint is ad:2e:92:41:6f:31:b1:c1:35:43:eb:df:f1:18:a1:c1.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added ‘server.com,10.10.10.24’ (RSA) to the list of known hosts.Password: (enter password) 在这个认证信息中,可以看到提示:无法确认主机server.com (10.10.10.24)的真实性,不过知道它的公钥指纹,是否继续连接?输入yes继续连接后,就会确认该服务器为可信任服务器,然后添加到known_hosts文件中,下次不用再次确认,然后跳转到输入密码的验证阶段。这种简单粗暴的方式相当于让我们肉眼比对来判断目标服务器是否是真实服务器,我觉得并不是最理想的方式,希望后续会有更完美的认证方式。之所以用fingerprint(公钥指纹)代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。SSH免密登录我们已经掌握如何使用ssh登录远程服务器了,但是每次登录都要输入密码,比较麻烦。ssh提供一种免密登录的方式:公钥登录。在客户端使用ssh-keygen生成一对密钥:公钥+私钥将客户端公钥追加到服务端的authorized_key文件中,完成公钥认证操作认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端服务端检索authorized_key文件,确认该公钥是否存在如果存在该公钥,则生成随机数R,并用公钥来进行加密,生成公钥加密字符串pubKey(R)将公钥加密字符串传递给客户端客户端使用私钥解密公钥加密字符串,得到R服务端和客户端通信时会产生一个会话ID(sessionKey),用MD5对R和SessionKey进行加密,生成摘要(即MD5加密字符串)客户端将生成的MD5加密字符串传给服务端服务端同样生成MD5(R,SessionKey)加密字符串如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功此时不用输入密码,即完成建连,可以开始远程执行shell命令了实现免密登录ssh-genkey是生成密钥的工具,执行完成后生成公钥和密钥,这两个文件会默认保存在/.ssh/路径下。常用的参数为:-t: 指定生成密钥类型(rsa、dsa)。默认为rsa-f: 指定存放私钥的文件,公钥文件名为私钥文件名加.pub后缀。默认为id_rsa-P: 指定passphrase(私钥的密码),用于确保私钥的安全。默认为空-C: 备注。默认为user@hostname我们直接执行来生成密钥,所有的参数都可以为空,也就是一直回车确认:$ ssh-keygenGenerating public/private rsa key pair.Enter file in which to save the key (/home/work/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in id_rsa.Your public key has been saved in id_rsa.pub.The key fingerprint is:74:17:74:38:b2:c7:70:fd:1d:33:eb:e2:71:71:cc:11 work@client.com此时,生成的文件在/.ssh/目录下,我们会看到这些文件:id_rsa // 私钥文件 id_rsa.pub // 公钥文件authorized_keys // 存放客户端公钥的文件known_hosts // 确认过公钥指纹的可信服务器列表的文件config // 指定不同域名使用哪个密钥的配置文件因为一台机器即能是客户端,又能是服务端,因此同时存在authorized_keys(在该机器为服务端时使用)和Known_hosts(在该机器为客户端时使用)。我们的服务器会有很多的用户,如果所有的用户都用同一份密钥,可能就没办法划分权限或者区分用户,如多个用户提交git就需要按照用户名来生成密钥,用于区分用户。同时你可能也希望针对不同的服务器使用不同的密钥对,因此需要config配置文件来配置针对不同服务器的配置:$vim ~/.ssh/configHost a.baidu.comUser workIdentityFile ~/.ssh/id_rsaHost b.baidu.comUser zhaoshuaiqiangIdentityFile ~/.ssh/zhaoshuaiqiang这样在连接不同的服务器时,就会使用不同的密钥文件来登录。在客户端生成密钥对之后,将公钥追加到服务器的authorized_keys文件中即可。 … 15 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAn30bjwtkLW82vTlLMQnI/a42J2g7o+HBCpSzBgNG+xfZuSNQOAU8+FNKQvriT4AL7ToiTtrZDLOEGqyQzaxQejuNnWG6aQ9ETh96qXhVLecWidaBieFGuv+F uXz6x551xtFXx64AzG+706dhnv1nOACYlrnfvXhi5kZzWzprET+CxMIeYhJQwwc19pF5zCWeU9QUvd1mOu0n8JVycevmuXRdVx9WpXq2+aaaaaaaa3uYGMBxvSLtT40O1AiEZ+k9EeYCnTEV tnGoVWCyxpwv6rR/GDOtJL/d+/Wb6I0HEKxxe087yZz8GWpQN5TEIAjq3oEjI/aiGw== work@a.baidu.com 16 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzRmK+CAVLnryXqQwweu8Yji8bGAvqzf8PSDzYn1nmE6ZeDkBbrWvFlVZ2yOip3IX8RjvuPc28mTCr0LsIOOmpvET0SzOkt0hzLBPiyCN/QvbKU/RbUv8v5y2 hEAlbUkMEzv7qOHQEruGEvA5y99gf/nYjK5OFKVpmg838OScUV3i88Xbqk8rtcuRZHWuZLnuB5spBsEE5r1UrnH/Ik7frZr8Vb4X6aZWbAp1yc0SqZ8JXVbmOiakqq0WqkLm+zqhEwr+Ooh2guH23x9zjMqY Uy+aaaaaBEBC+LepCvskArBt/SRwJDJkcItz8T7kBC3CP0Y0X4hB+6k6/yM/pup5w== work@b.baidu.com此时,即可免密登录服务器。私钥的安全性假设你已经实现了服务器集群的免密登录,那么如果你的一台客户端被攻击成功了,那么整个集群的安全性便荡然无存了。因此,我们有时还需要对密钥做安全性保障,即设置私钥密码:// 使用rsa方法加密,生成test密钥对,私钥密码为123456ssh-keygen -t rsa -f test -P 123456 此时,各机器仍然是免密登录,但是需要你输入私钥密码:$ssh work@a.baidu.comEnter passphrase for key ‘/home/work/.ssh/test’: 参考资料RUNOOB-Linux scp命令:http://www.runoob.com/linux/l…linux-doc scp跨机远程拷贝:https://linuxtools-rst.readth…维基百科 Secure Shell:https://zh.wikipedia.org/wiki…简书 图解SSH原理:https://www.jianshu.com/p/334…CSDN scp在linux中实现两台主机传件–互信无需输入密码: https://blog.csdn.net/posonri… ...

February 27, 2019 · 1 min · jiezi

非对称加密算法--RSA加密原理及运用

密码学是在编码与破译的斗争实践中逐步发展起来的,并随着先进科学技术的应用,已成为一门综合性的尖端技术科学。密码学发展史在说RSA加密算法之前, 先说下密码学的发展史。其实密码学的诞生,就是为了运用在战场,在公元前,战争之中出现了秘密书信。在中国历史上最早的加密算法的记载出自于周朝兵书《六韬.龙韬》中的《阴符》和《阴书》。在遥远的西方,在希罗多德(Herodotus)的《历史》中记载了公元前五世纪,希腊城邦和波斯帝国的战争中,广泛使用了移位法进行加密处理战争通讯信息。相传凯撒大帝为了防止敌人窃取信息,就使用加密的方式传递信息。那么当时的加密方式非常的简单,就是对二十几个罗马字母建立一张对照表,将明文对应成为密文。那么这种方式其实持续了很久。甚至在二战时期,日本的电报加密就是采用的这种原始加密方式。早期的密码学一直没有什么改进,几乎都是根据经验慢慢发展的。直到20世纪中叶,由香农发表的《秘密体制的通信理论》一文,标志着加密算法的重心转移往应用数学上的转移。于是,逐渐衍生出了当今重要的三类加密算法:非对称加密、对称加密以及哈希算法(HASH严格说不是加密算法,但由于其不可逆性,已成为加密算法中的一个重要构成部分)。1976年以前,所有的加密方法都是同一种模式:加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法",使用相同的密钥,两次连续的对等加密运算后会回复原始文字,也有很大的安全隐患。1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为"Diffie-Hellman密钥交换算法"。也正是因为这个算法的产生,人类终于可以实现非对称加密了:A给B发送信息B要先生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。A获取B的公钥,然后用它对信息加密。B得到加密后的信息,用私钥解密。理论上如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是232个十进制位,也就是768个二进制位,因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全,当然量子计算机除外。RSA算法的原理下面进入正题,解释RSA算法的原理,其实RSA算法并不难,只需要一点数论知识就可以理解。素数:又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。互质,又称互素。若N个整数的最大公因子是1,则称这N个整数互质。模运算即求余运算。“模”是“Mod”的音译。和模运算紧密相关的一个概念是“同余”。数学上,当两个整数除以同一个正整数,若得相同余数,则二整数同余。欧拉函数任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)计算这个值的方法就叫做欧拉函数,以(n)表示。计算8的欧拉函数,和8互质的 1、2、3、4、5、6、7、8(8) = 4如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则(n) = (p^k) = p^k - p^(k-1)。也就是(8) = (2^3) =2^3 - 2^2 = 8 -4 = 4计算7的欧拉函数,和7互质的 1、2、3、4、5、6、7(7) = 6如果n是质数,则 (n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。计算56的欧拉函数(56) = (8) (7) = 4 6 = 24如果n可以分解成两个互质的整数之积,即 n = p k ,则(n) = (p k) = (p1)(p2)欧拉定理:如果两个正整数m和n互质,那么m的(n)次方减去1,可以被n整除。费马小定理:欧拉定理的特殊情况,如果两个正整数m和n互质,而且n为质数!那么(n)结果就是n-1。模反元素还剩下最后一个概念,模反元素:如果两个正整数e和x互质,那么一定可以找到整数d,使得 ed-1 被x整除,或者说ed被x除的余数是1。那么d就是e相对于x的模反元素。等式转换根据欧拉定理由于1^k ≡ 1,等号左右两边都来个k次方由于1 m ≡ m,等号左右两边都乘上m根据模反元素,因为ed 一定是x的倍数加1。所以如下:通过多次的等式转换。终于可以将这两个等式进行合并了!如下:这个等式成立有一个前提!就是关于模反元素的,就是当整数e和(n)互质!一定有一个整数d是e相对于(n)的模反元素。我们可以测试一下。m取值为4n取值为15(n)取值为8e 如果取值为3d 可以为 11、19…(模反元素很明显不止一个,其实就是解二元一次方程)如果你测试了,那么你可以改变m的值试一下,其实这个等式不需要m和n 互质。只要m小于n 等式依然成立。这里需要注意的是,我们可以看做 m 通过一系列运算得到结果仍然是 m。这一系列运算中,分别出现了多个参数n、(n)、e还有d。m 的 e乘上d 次方为加密运算,得到结果 cc 模以 n 为解密运算,得到结果 m这似乎可以用于加密和解密。但这样,加密的结果会非常大。明文数据将非常小(虽然RSA用于加密的数据也很小,但是没这么大悬殊),真正的RSA要更加强大,那么RSA是怎么演变来的呢??早期很多数学家也停留在了这一步!直到1967年迪菲赫尔曼密钥交换打破了僵局!迪菲赫尔曼密钥交换这个密钥交换当时轰动了整个数学界!而且对人类密码学的发展非常重要,因为这个伟大的算法能够拆分刚才的等式。当非对称加密算法没有出现以前,人类都是用的对称加密。所以密钥的传递,就必须要非常小心。迪菲赫尔曼密钥交换 就是解决了密钥传递的保密性,我们来看一下假设一个传递密钥的场景。算法就是用3 的次方去模以17。 三个角色服务器 随机数 15这个15只有服务器才知道。通过算法得到结果 6 因为 3的15次方 mod 17 = 6 。然后将结果 6 公开发送出去,拿到客户端的 12 ,然后用12^15 mod 17 得到结果10(10就是交换得到的密钥)客户端 随机数13客户端用3 的 13次方 mod 17 = 12 然后将得到的结果12公布出去。拿到服务器的 6 ,然后用6^13 mod 17 得到结果10(10就是交换得到的密钥)第三者第三者只能拿到6 和 12 ,因为没有私密数据13、15,所以它没法得到结果10。为什么 6的13次方会和12的15次方得到一样的结果呢?因为这就是规律,我们可以用小一点的数字测试一下3^3 mod 17 = 10和10 ^ 2 mod 17 ; 3 ^ 2 mod 17 = 9和9^3 mod 17结果都是15。迪菲赫尔曼密钥交换最核心的地方就在于这个规律RSA的诞生现在我们知道了m^e % n = c是加密,c^d % n = m是解密,m就是原始数据,c是密文,公钥是n和e,私钥是n和d,所以只有n和e是公开的。加密时我们也要知道(n)的值,最简单的方式是用两个质数之积得到,别人想破解RSA也要知道(n)的值,只能对n进行因数分解,那么我们不想m被破解,n的值就要非常大,就是我们之前说的,长度一般为1024个二进制位,这样就很安全了。但是据说量子计算机(用于科研,尚未普及)可以破解,理论上量子计算机的运行速度无穷快,大家可以了解一下。以上就是RSA的数学原理检验RSA加密算法我们用终端命令演示下这个加密、解密过程。假设m = 12(随便取值,只要比n小就OK),n = 15(还是随机取一个值),(n) = 8,e = 3(只要和(n)互质就可以),d = 19(3d - 1 = 8,d也可以为3,11等等,也就是d = (8k + 1)/3 )终端分别以m=12,7输入结果OpenSSL进行RSA的命令运行Mac可以直接使用OpenSSL,首先进入相应文件夹生成公私钥// 生成RSA私钥,文件名为private.pem,长度为1024bitopenssl genrsa -out private.pem 1024// 从私钥中提取公钥openssl rsa -in private.pem -pubout -out publick.pem// 查看刚刚生成好的私钥cat private.pem// 查看刚刚生成好的公钥cat publick.pem我们可以看到base64编码,明显私钥二进制很大,公钥就小了很多。这时候我们的文件夹内已经多了刚刚生成好的公私钥文件了// 将私钥转换为明文openssl rsa -in private.pem -text -out private.txt里面就是P1、P2还有KEY等信息。对文件进行加密、解密// 编辑文件message内容为hello Vincent!!!// 刚刚的public.pem写成了publick.pem(哎。。。) $ vi message.txt $ cat message.txt hello Vincent!!!// 通过公钥加密数据时,使用encrypt对文件进行加密 $ openssl rsautl -encrypt -in message.txt -inkey publick.pem -pubin -out enc.txt// 此时查看该文件内容为乱码 $ cat enc.txtj��E]a��d�kUE�&< ��I��V/��pL[����O�+�-�M��K��&⪅O��2���o34�:�$���6��C�L��,b�‘M�S�k�0���A��3%�[I���1�����ps"%// 通过私钥解密数据 $ openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt// 已成功解密,正确显示文件内容 $ cat dec.txt hello Vincent!!!// 通过私钥加密数据时,要使用sign对文件进行重签名$ openssl rsautl -sign -in message.txt -inkey private.pem -out enc.bin// 此时查看该文件内容同样为乱码$ cat enc.bin{���Ew�3�1E��,8-OA2�Is�:���:�@MU���� �i1B���#��6���m�D(�t#/��� ��������>(�>�^@�C��3�MQ�O%// 通过公钥解密数据$ openssl rsautl -verify -in enc.bin -inkey publick.pem -pubin -out dec.bin// 已成功解密,正确显示文件内容$ cat dec.bin hello Vincent!!!RSA用途及特点到这里,大家都知道RSA通过数学算法来加密和解密,效率比较低,所以一般RSA的主战场是加密比较小的数据,比如对大数据进行对称加密,再用RSA给对称加密的KEY进行加密,或者加密Hash值,也就是数字签名。关于RSA数字签名后面再慢慢阐述。该文章为记录本人的学习路程,希望能够帮助大家,也欢迎大家点赞留言交流!!!https://www.jianshu.com/p/ad3… ...

January 4, 2019 · 2 min · jiezi