PHP开发接口怎么使用RSA加密解密?非对称加密解密算法

2021-10-21 16:06 php分享 93 梁俊威

PHP加密算法有非常多种类,近期项目中使用到RSA加密算法,用这篇文章记录一下RSA是如何加密解密的。

一、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:
a、openssl genrsa -out rsa_private_key.pem 1024
b、openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
c、openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem
第二条命令将原始 RSA私钥转换为 pkcs8格式
第三条生成RSA公钥 rsa_public_key.pem

第二步:php中RSA的使用方法

先讲解使用私钥加密,公钥解密。

私钥加密

// 自行切换路径
$pri_file = file_get_contents("private_key.pem");
// 判断当前私钥是否可用,如果可用会返回资源数据
$pri_key = openssl_pkey_get_private($pri_file);
// 承载数据容器
$encrypt = ""; 
// 私钥加密 $data需要加密的数据 $pri_key上面获取到的资源数据, $encrypt承载的容器
openssl_private_encrypt($data, $pri_key, $encrypt);
var_dump($encrypt);

公钥解密

$pub_file = file_get_contents("public_key.pem");
// 判断当前私钥是否可用,如果可用会返回资源数据
$pub_key = openssl_pkey_get_public($pub_file );
// 解密承载数据的容器
$decrypt = "";
// 使用了私钥加密需要解密就必须使用公钥
openssl_public_decrypt($encrypt, $decrypt, $pub_key);
var_dump($descypt);

而公钥加密只需要将openssl_pkey_get_private换成openssl_pkey_get_public,将openssl_private_encrypt换成openssl_public_encrypt

私钥解密只需要将openssl_pkey_get_public换成openssl_pkey_get_private,将openssl_public_encrypt换成openssl_private_encrypt即可。

值得注意的是,这里有个坑大家千万别踩到了!有的小伙伴会将公钥、私钥放在一行里面(一个变量一行过),例如:

$pri_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCkD/X2vbLV3WVGRb5RqbwAA4rkj8a+tgikHOEhJCsWJtQIBZxQYO/Lde2uE0v4dZlO8NI26sJquc+9XA+cmqEzBHi1Gp5DdGoMz+Q0X9XjoYW5QUjEAG0+APxBrXLVz+CiGp8TMk0bcer9tZIJZTHNhcCfv8srgXDRpHl1EazaxSmv5bQieuEGaK2mm8eizFia46QdRCp+3PS1BPeyybLSgfYSoHcyegERPCJwMYFs0mwW2ahZy6Mhdd/e+DXy8paW6jalFIZNnQbrvEsasDqlzBN+5iUna7lcDbSNPyaC9Zp2Tpy5KifrmH2yFJJbOBtQ9S91+1XiXpIaNv/6GKh5AgMBAAECggEAVlXv4gDB87mmaeyZ0u+3d2pl1RG0TPgOZA6uino2ElosimwpbkMU7cUJZunQuNdp7hjdBvlThkZyA/xGWuskmWxo+SUg0+6XQFbGiKlGLZv6exrX6A0xb8ek+AsGu23BkIzh2YBHA4JXX1wFldwi8TzJuUd861Aaxrf/EpRSmmz/J3sIY5bbB/I4Gy0WlrsM5GErePfw6ttshIDH6mLzCTMZ54jea6l4uCuQbVOin8yRc8PTjWgLocxIsb5dEghaI7EoPm5gcd3toVHwGHmc3eiSgSBXDvo23qmtC4N4wEhsSUp6m/bWeqbP21gUfNV2my7lqIOEAs2vXrivDNivgQKBgQDXJzJnI+51asWuIjqTKLJqczAIM2PDgmuoIX/oXjY6YWthRzMlpPhux0J4JjBHFhrFFwGLImu9mPWVzDdALVxTBNJlKf4bLLCzD3Xf/ml861BFzIyY+b7Ol1Xn4XhO2cvz91G7zq6K4jbJD7ydLdhOZhAyaQHebsdSi3ipwn4wxQKBgQDDNaqw8jPUyLqSoMkcsgcjbQQS9efuD8TqPRQFcwSsbjE4nNml9jL5qZwDiPrf0EfD+c6tY5aUo9FjU16SPjaB88DpakrcqsNbaFzayrsXlBTy+gEBlWh2595e8768FEfm2r5g9QrTt6Gkd0qZCauqluLYLaBbyqI3zhrQB67sJQKBgQCoYZrGsY48AnX3E/63kNAhE0jyAhX/uqA6kw0hdCoIgpmhJjHXMkbjm7pfgbOizp/gw2KH20ZqubzpoUtURKvOpSVr2vNtnQok+OKNjPRNuXO3TKB0UHCOCk5HDWQ0gatmoZYr31MmimfJ7zDz6h8xLBtc+GVoCVahOVoTsY1E6QKBgQC+KS9oQ+jd5dRqNhrzyzFM/0uytL4EmHP4wxsX2923o3hrb9BN7bHmp6UFhJDvKlRewqDlI1hy38p/+Zzs1ZH/sdZBC3x1zhuUleuub0MmSujFcWk9g7BJ9MIYuVUanp8Ucg53IP41FHNwZYzT3CnQej/s2zWVdaXkuvA/qtxpyQKBgHlv+4IsWWjC9fcfgbpnuv3SIMSoKfX45M6wZlM7jmQfRX8uyoMZyricKag6ItseoyZ/rrcOLEKKck/ylTXjoTMhhKDhXJs8xnB9JG6qOHKgkwMIyRhCA2FQ8f/eVKckhBh43bHQ1laFEUEKrEomorTz2uMtA5gOwi/5umuoosn0"

这样可能会导致无法识别公钥从而不会返回资源数据回来。

三、算法有非常多种类,感兴趣的朋友可以了解一下。

在日常设计及开发中,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文加密成复杂的密文。目前主流加密手段大致可分为单向加密和双向加密。

单向加密:通过对数据进行摘要计算生成密文,密文不可逆推还原。算法代表:Base64,MD5,SHA; 

双向加密:与单向加密相反,可以把密文逆推还原成明文,双向加密又分为对称加密和非对称加密。

对称加密:指数据使用者必须拥有相同的密钥才可以进行加密解密,就像彼此约定的一串暗号。算法代表:DES,3DES,AES,IDEA,RC4,RC5;

非对称加密:相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,

也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能解密。这两个密钥是数学相关,用某用户密钥加密后的密文,只能使用该用户的加密密钥才能解密。如果知道了其中一个,并

不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥性质。这里把公开的密钥为公钥,不公开的密钥为私钥。算法代表:RSA,DSA。


若无特殊说明,本站点所有内容均为原创,转载请说明出处!

原文链接:https://www.ljwei.com.cn/read/357.html

QQ客服

QQ客服

微信客服

微信客服

微信客服二维码
意见反馈

意见反馈

一键置顶