Loading... # 名词点击 > 以下内容摘自百度百科 ## RSA算法 **RSA算法是一种非对称加密算法,与对称加密算法不同的是,RSA算法有两个不同的密钥,一个是公钥,一个是私钥。** **RSA**公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。 **在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK** 。 **正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与**公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 ## 公开密钥密码体系 公开密钥密码体制是现代密码学的最重要的发明和进展。一般理解密码学(Cryptography)就是保护信息传递的机密性。 ### 简介 **这仅仅是当今密码学主题的一个方面。对信息发送与接收人的真实身份的验证、对所发出/接收信息在事后的不可抵赖以及保障数据的完整性是现代密码学主题的另一方面。** 公开密钥密码体制对这两方面的问题都给出了出色的解答,并正在继续产生许多新的思想和方案。在公钥体制中,加密密钥不同于解密密钥。人们将加密密钥公之于众,谁都可以使用;而解密密钥只有解密人自己知道。迄今为止的所有公钥密码体系中,RSA系统是最著名、使用最广泛的一种。 ### 概念 **公钥体系结构中的一些基本概念与结构组成。** **密钥对在基于**公钥体系的安全系统中,密钥是成对生成的,每对密钥由一个公钥和一个私钥组成。在实际应用中,私钥由拥有者自己保存,而公钥则需要公布于众。为了使基于公钥体系的业务(如电子商务等)能够广泛应用,一个基础性关键的问题就是公钥的分发与管理。 **公钥本身并没有什么标记,仅从公钥本身不能判别公钥的主人是谁。** **在很小的范围内,比如A和B这样的两人小集体,他们之间相互信任,交换公钥,在互联网上通讯,没有什么问题。这个集体再稍大一点,也许彼此信任也不成问题,但从法律角度讲这种信任也是有问题的。如再大一点,信任问题就成了一个大问题。** ### 信息安全目标 **通常信息安全的目标可以概括为解决信息的以下问题:** **保密性(Confidentiality)保证信息不泄露给未经授权的任何人。** **完整性(Integrity)防止信息被未经授权的人篡改。** **可用性(Availability)保证信息和信息系统确实为授权者所用。** **可控性(Controllability)对信息和信息系统实施安全监控,防止非法利用信息和信息系统。** **密码是实现一种变换,利用密码变换保护信息秘密是密码的最原始的能力,然而,随着信息和信息技术发展起来的现代密码学,不仅被用于解决信息的保密性,而且也用于解决信息的完整性、可用性和可控性。可以说,密码是解决信息安全的最有效手段,**密码技术是解决信息安全的核心技术。 **公用密钥的优点就在于,也许你并不认识某一实体,但只要你的服务器认为该实体的CA是可靠的,就可以进行安全通信,而这正是Web商务这样的业务所要求的。例如信用卡购物。服务方对自己的资源可根据客户CA的发行机构的可靠程度来授权。国内外尚没有可以被广泛信赖的CA。美国Natescape公司的产品支持公用密钥,但把Natescape公司作为CA。由外国公司充当CA在中国是一件不可想象的事情。** **公共密钥方案较保密密钥方案处理速度慢,因此,通常把公共密钥与专用密钥技术结合起来实现最佳性能。即用公共密钥技术在通信双方之间传送专用密钥,而用专用密钥来对实际传输的数据加密解密。另外,公钥加密也用来对专用密钥进行加密。** **在这些安全实用的算法中,有些适用于密钥分配,有些可作为**加密算法,还有些仅用于数字签名。多数算法需要大数运算,所以实现速度很慢,不能用于快的数据加密。以下将介绍典型的公开密钥密码算法-RSA。 RSA算法很好的完成对电文的数字签名以抗对数据的否认与抵赖;利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。很多种加密技术采用了RSA算法,比如PGP(PrettyGoodPrivacy)加密系统,它是一个工具软件,向认证中心注册后就可以用它对文件进行加解密或数字签名,PGP所采用的就是RSA算法。由此可以看出RSA有很好的应用。 # 使用PHP对数据进行加解密 <iframe src="https://player.bilibili.com/player.html?isOutside=true&aid=112757018004036&bvid=BV1T7aBeZEsA&cid=500001610220775&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe> ## 直接通过公钥和私钥加解密 ### 加密 加密时,你可以使用公钥和私钥进行加密,随后将数据再进行base64加密即可得到密文 想要解密时则需要通过对应的公钥和私钥进行解密 以下所有操作我均使用公钥加密,私钥解密 下面我们来进行加密操作 在此之前,我已经生成过公钥和私钥了,如果你没有生成,可以百度RSA公私钥在线生成或者看下一个H2大标题 我将生成的公钥保存到名为publickey的变量中,注意格式,不要缺少起止符 如图所示 ![公钥变量](https://bucket.iczrx.cn/2024/07/09/668d0dc5ae3ed.jpg) 随后定义一个data的变量,用来存需要加密的数据 接着就可以用php内置函数进行加密了 这里用到openssl_public_encrypt函数 参数依次为需要加密的数据、保存密文的变量、公钥 紧接着再通过base64将保存密文的变量再一次加密,随后我们就得到了最终RSA加密的密文 输出这个密文查看一下 ![得到一长串的密文](https://bucket.iczrx.cn/2024/07/09/668d0ea0af5c6.jpg) 这个就是加密后的数据 加密部分的代码: ```php <?php $publicKey = "此处填入公钥"; $data = "晚夜的个人博客"; openssl_public_encrypt($data,$endata,$publicKey); $endata = base64_encode($endata); echo "加密后的数据:".$endata; ?> ``` ### 解密 解密的操作类似于加密操作 在这里,我将私钥保存到一个叫privatekey的变量中 将获取到的密文保存到endata的变量中 随后使用openssl_private_decrypt函数对数据进行解密 这里需要的参数为密文、保存解密数据的变量、私钥 这里需要注意,由于上一步我们对数据进行base64加密了,那么再解密时也应该还原成初始密文,再用base64进行解密 运行输出解密后的数据: ![输出的结果](https://bucket.iczrx.cn/2024/07/09/668d0fba55847.jpg) 解密部分代码如下: ```php <?php $privatekey = "此处填写私钥"; $endata = "此处填写密文"; openssl_private_decrypt(base64_decode($endata),$dedata,$privatekey); echo "解密后的数据:".$dedata; ?> ``` ## 通过PHP生成公私钥进行加密解密 ### 生成公钥、私钥 除了将公私钥直接输进去,我们还可以通过php实时生成公钥和对应的私钥 代码如下: ```php <?php // 配置 $config = array( "digest_alg" => 'sha256', "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); // 创建私钥 $res = openssl_pkey_new($config); // 提取私钥到$privKey openssl_pkey_export($res, $privKey); // 提取公钥到$pubKey $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; // 存储到变量 $privkey = $privKey; $pubkey = $pubKey; echo "私钥:".$privkey; echo "<br/>"; echo "公钥:".$pubkey; ?> ``` 运行一下就可以看到以下结果: ![浏览器返回结果](https://bucket.iczrx.cn/2024/07/09/668d11c41cd8d.jpg) ### 加密解密 这里加密解密操作和上一步的操作是一样的,我们直接上代码 ```php <?php // 配置 $config = array( "digest_alg" => 'sha256', "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); // 创建私钥 $res = openssl_pkey_new($config); // 提取私钥到$privKey openssl_pkey_export($res, $privKey); // 提取公钥到$pubKey $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; // 存储到变量 $privkey = $privKey; $pubkey = $pubKey; //加密操作 $data = "晚夜的个人博客"; openssl_public_encrypt($data,$endata,$pubKey); $endata = base64_encode($endata); //解密操作 openssl_private_decrypt(base64_decode($endata),$dedata,$privkey); echo "私钥:".$privkey; echo "<br/>"; echo "公钥:".$pubkey; echo "<br/>"; echo "加密后的数据:".$endata; echo "<br/>"; echo "解密后的数据:".$dedata; ?> ``` 运行以下,则会看到如下结果 ![浏览器输出结果](https://bucket.iczrx.cn/2024/07/09/668d12e5a201c.jpg) --- 至此,PHP通过RSA进行加密解密操作到此结束了 如有不足,欢迎指出~ 最后修改:2024 年 08 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 6 如果觉得我的文章对你有用,请随意赞赏