明党参

首页 » 常识 » 问答 » 加解密与HTTPS2
TUhjnbcbe - 2024/10/16 10:03:00

您好,我是湘王,这是我的百家号,欢迎您来,欢迎您再来~

近些天由于完全放开,我也从“杨过”变成了“杨康”,加之家中亲人故去,所以长久未能更新,特此致歉~

上次说了对称加密算法,这次来说说另外一种加密算法:非对称加密算法。

和对称加密算法不同,在非对称加密算法中,信息的收发双方需要各持有两个密钥:公钥和私钥。公钥和私钥是成对出现的:公钥必须公开,而私钥必须保密。

发送者A用接收者B的公钥加密,接收者B用自己的私钥解密。整个过程是这样的:

有几种常用的非对称加密算法:

1、RSA/DSA

2、ECDSA/ECC

3、PKCS

RSA是一种非常常见的非对称加密算法,它的加密和解密算法也都是公开的,其运行机制用一句简单的话来说就是几乎「不可能通过公钥推导出私钥」。

非对称加密算法产生的密钥都是成对出现的,一个公开的公钥,一个由用户自己保存的私钥。

RSA被认为是最优秀的非对称加密方案之一,支付宝的支付接口调用使用的就是RSA。

「不可能通过公钥推导出私钥」的机制,是建立在大整数因子分解的困难性上的,其安全性能够抵抗目前为止已知的绝大多数密码攻击。RSA的加密解密过程如下:

可以看到,如果要得到一个能够产生位或位二进制的质数乘积,参与运算的两个质数一定都是天文数字。对质数的乘积进行因式分解极其困难,即使是使用计算机也一样,因为素因子太多。这就是为什么可以说几乎「不可能通过公钥推导出私钥」的原因。

DSA和RSA的主要不同在于它不用作加密和解密,只用作签名,银行自助柜台、金融APP上的签名软件用的就是它。DSA签名生成速度很快,但验证速度比较慢,加密时更慢,解密却很快,这一点与RSA相反,其安全性与RSA差不多。实际上,OpenSSH7.0及以上版本默认禁用了DSA算法。

全称椭圆曲线加密(Ellipticcurvecryptography),以太坊的比特币地址就是用它生成的(比特币椭圆曲线采用的是secpk1算法:y2=x3+7)。ECC的数学基础是黎曼几何中的无穷远点性质、群率(GROUPLAW)公式,解释起来非常麻烦。

下面可以通过OpenSSL来演示比特币的加密与解密过程。这个OpenSSL在Linux上一般都是默认安装了的,Windows上面的安装可以问问度娘。

第一步:生成ECC私钥

#opensslecparam-namesecpk1-genkeyprivate.pem

#查看结果

#catprivate.pem

#输出DER格式

#opensslec-inprivate.pem-outformDER

tail-c+8

head-c32

xxd-p-c32private.der

#catprivate.der

#查看结果

#cba7ba9b5d29a9f27ce67e8e88cce40abee2bc8db4eaab5a2

第二步:生成ECC公钥

通过private.pem生成未压缩公钥

#opensslec-inprivate.pem-pubout-outformDER

tail-c65

xxd-p-c65public.der

#查看结果(未压缩公钥=前缀04+x坐标+y坐标)

#catpublic.der

#db6badbedccefd1a19aad82e61cbafe2fb8ffee9a3b6cf0ebd2bfa62ea9fcf1cd25

#压缩公钥(前缀03+x(如果y是奇数),前缀02+x(如果y是偶数))结果

#03edcfa68dcadd7fdfc2efdad9d6d1a7dc1eea0b

第三步:执行Hash运算

先执行SHA操作,再进行RMD运算

#opensslshapublic.der

#结果是

#abbbbb2c1acf1f3ae98c01abbebdcf

#保存结果

#echoabbbbb2c1acf1f3ae98c01abbebdcfpublic_sha.der

#opensslripemdpublic_sha.der

#结果

#db0ccf40cfdbfbcda4cd4

#保存结果

#echodb0ccf40cfdbfbcda4cd4public_rmd.der

第四步:添加ECC前缀

可以给第3步结果加上Bitcoin的地址前缀(具体地址可以问度娘),例如,普通主网地址是00

#00+db0ccf40cfdbfbcda4cd4

#结果

#00db0ccf40cfdbfbcda4cd4

#保存结果

#vipublic_rmd.der

#在前面增加00,保存退出

#查看结果

#catpublic_rmd.der

第五步:执行SHA

执行两次SHA,取前8位作为校验和

#opensslshapublic_rmd.der

#echocf1cbdcd7af0dc8fd4cf7aaeea7d97f45c83eac22c04public_sha.der

#opensslshapublic_sha.der

#结果

#dc36fc5d37cadfa1fffa7e15d05fcc30e8aa

#取前八位

#d

第六步:第四步和第五步结果合并

#第四步结果

#catpublic_rmd.der

#00db0ccf40cfdbfbcda4cd4

#第五步结果

#d

#结果合并

#echo00db0ccf40cfdbfbcda4cd4dpublic_result.der

第七步:执行Base58编码

Base59编码是一种独特的编码方式,是Base64的变形,主要用于比特币的钱包地址。

出于演示目的,仅用Base64执行编码

#opensslbase64-inpublic_result.der

#结果

#MDA5ODcwZGIwY2NmNDBjZmQ5NzBiNTAzZmIwMzFjODg5ZDA4OWE0Y2Q0OTU1MGQ0NDUK

小知识:在比特币系统中,通过私钥能得到公钥,通过公钥能得到钱包地址,也就是:私钥=公钥=钱包地址,而反向是不可以的。

PKCS全称公钥加密标准(Public-KeyCryptographyStandards),是由RSA公司设计、发布的一系列安全标准。主要用于证书申请、更新、作废、数字签名、数字信封等创建。例如目前苹果的IOS使用的就是PKCS12标准的证书。

还是以OpenSSL生成PKCS12为例说明。

第一步:密钥生成和使用

生产一个位的私钥,保存在rsa_private_key.pem里

#opensslgenrsa-outrsa_private_key.pem

通过私钥生产公钥,保存在rsa_public_key.pem里

#opensslrsa-inrsa_private_key.pem-pubout-outrsa_public_key.pem

第二步:生成pkcs12文件

密钥库keyrepo.p12,密码,有效期1天

#keytool-genkey-v-aliasroot-keyalgRSA-storetypePKCS12-keystorekeyrepo.p12-dname"CN=

1
查看完整版本: 加解密与HTTPS2