linux
上生成一下rsa
Ps:openssl
是一堆加密算法和安全协议的开源集合,像RSA,DES,MD5,RC4等等,都能在openssl
里面找到源代码.php
用openssl指定生成test.key文件,其中包含公钥+私钥,1024为生成密钥长度linux
tb@tb:~/mimi$ openssl genrsa -out test.key 1024 Generating RSA private key, 1024 bit long modulus .++++++ ....................................................++++++ e is 65537 (0x10001)
能够简单查看下,注意这里包括私钥+公钥android
vim test.key -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCpS7mxdU6svbDcs10qbq9f9t5D4yfqC1jLmZD3GDD4D/8TbNkf vcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yulXZyvPurfN/1AJt4JYDxnN/q u1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UWy8ezLy6UWFQCrnUHEQIDAQAB AoGAQCQeoKtvOWdNIPEb9T2mWFdx8oqXzsapx8nQ8K1LsFBvNe7hfHMsGLLOjzhI G7223eiEm07mMaJF2XvOaEpSYX/qQ1LZRSdBrzCec1lcDbB95dcRg9NmgBuCpUxE 3SGYm3VB8rurfsrRUUYoIbjWz8qyuIGdMbaNkHG/CpnUYpkCQQDfWYDYtQ3DxCt+ JBoLfuCykk8+nIV12CIYb023naoR2s/aQQRk9BkGCkDrdOAgZAN3BGOHYseKAfTP nARDzfiDAkEAwgtYfgCDTOfW5/kJK1lZO21CdCCZnePwGYmWDLPzNiJIn8k0U6Ig 9GmxG+0GKzY71XO8W3Nh18ilZbX9dYel2wJASQ+AJGNlc0pyZ7rrgiMo4YEWxwZw adIfpRqTs6KxhVGseFqYU2W94cns3pjG0BGnSIF5BUp8t1pYeKkyg/OWfQJBAK1w mq41IycQaoR5kfqPKDT32dgWc3gvDqKk2duM1KzkQ+meXAkM90u/VLDTURo6pYyK oCdVoHTRQRUCcAQnNNUCQQCO/zDRaY+5ssjPqj77eJqWfAhtbSDRRw+NurmUSas1 FT1cD5nil+uT48bIRoC5nk/XWfvAvMg/Yw5bslGUNx7f -----END RSA PRIVATE KEY-----
~
经过下面命令生成公钥出来ios
tb@tb:~/mimi$ openssl rsa -in test.key -pubout -out test_pub.key writing RSA key
此时咱们有公钥test_pub.key
和公钥+私钥test.key
算法
tb@tb:~/mimi$ ls test.key test_pub.key
能够查看下公钥,短了点数据库
tb@tb:~/mimi$ vim test_pub.key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpS7mxdU6svbDcs10qbq9f9t5D 4yfqC1jLmZD3GDD4D/8TbNkfvcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yu lXZyvPurfN/1AJt4JYDxnN/qu1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UW y8ezLy6UWFQCrnUHEQIDAQAB -----END PUBLIC KEY----- tb@tb:~/mimi$
demo.php
tb@tb:~/mimi$ cat demo.php <?php echo 'tb'; tb@tb:~/mimi$
咱们加密下demo.php
,-in
指定加密文件,-inkey
指定密钥,-pubin
意思用公钥加密-out
输出文件vim
tb@tb:~/mimi$ openssl rsautl -encrypt -in demo.php -inkey test_pub.key -pubin -out demo.en tb@tb:~/mimi$ ls demo.en demo.php test.key test_pub.key
咱们看加密后的demo.php
,彻底看不懂。。看来加密成功。安全
tb@tb:~/mimi$ cat demo.en z0?!1I¢+i2?Y? 縏,°?¨IB?}?¤9§???stBI ??]〢sk膷j-???1日T-′.) J?qz+{°Qˉ3 tb@tb:~/mimi$
而后咱们须要把加密后的demo.php
解密回来,-inkey
指定解密文件,服务器
tb@tb:~/mimi$ openssl rsautl -decrypt -in demo.en -inkey test.key -out demo.cn
下面的demo.cn就是解密后的文件,app
tb@tb:~/mimi$ ls demo.cn demo.php test_pub.key demo.en test.key tb@tb:~/mimi$ cat demo.cn <?php echo 'tb'; tb@tb:~/mimi$
1、服务端/移动端(ios,android)加密:流程
一、生成rsa公钥,私钥 二、移动端保留私钥,经过http将公钥传输给服务端(如http,须要base64_e(d)ncode函数对,由于会有特殊字符) 三、服务端接受公钥后,用公钥把对称加密aes的key加密, 四、服务端把须要给移动端的数据data用对称加密算法aes 加密 五、服务端把加密的data和加密的aes key给移动端 六、移动端经过私钥把服务端用公钥加密的key解密,而后用aes解密data数据
可是这个怎么交互,怎么识别,包括怎么不影响传输效率,最小减轻服务器压力。本人尚未概念。。不知道支付宝啥的怎么作的。但愿大神指教
1
发送方用一个hash算法对数据生成数据的摘要,而后用私钥对摘要进行签名,将此摘要和总体数据给接收方。接收方收到摘要和总体数据,用公钥解密,获得摘要。到此只能证实消息确实由发送方发出,可是怎么肯定中途有没有被篡改呢?
2
接收方在对消息进行文件hash,生成摘要,若是接收方生成的摘要和用公钥解密后的摘要相等。那么就证实了文件确实为发送方发送,并且没有被篡改。
3
简而言之:
一-->公钥加密,私钥解密。
二-->私钥签名,公钥验证。
<?php $private_key = "-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCpS7mxdU6svbDcs10qbq9f9t5D4yfqC1jLmZD3GDD4D/8TbNkf vcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yulXZyvPurfN/1AJt4JYDxnN/q u1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UWy8ezLy6UWFQCrnUHEQIDAQAB AoGAQCQeoKtvOWdNIPEb9T2mWFdx8oqXzsapx8nQ8K1LsFBvNe7hfHMsGLLOjzhI G7223eiEm07mMaJF2XvOaEpSYX/qQ1LZRSdBrzCec1lcDbB95dcRg9NmgBuCpUxE 3SGYm3VB8rurfsrRUUYoIbjWz8qyuIGdMbaNkHG/CpnUYpkCQQDfWYDYtQ3DxCt+ JBoLfuCykk8+nIV12CIYb023naoR2s/aQQRk9BkGCkDrdOAgZAN3BGOHYseKAfTP nARDzfiDAkEAwgtYfgCDTOfW5/kJK1lZO21CdCCZnePwGYmWDLPzNiJIn8k0U6Ig 9GmxG+0GKzY71XO8W3Nh18ilZbX9dYel2wJASQ+AJGNlc0pyZ7rrgiMo4YEWxwZw adIfpRqTs6KxhVGseFqYU2W94cns3pjG0BGnSIF5BUp8t1pYeKkyg/OWfQJBAK1w mq41IycQaoR5kfqPKDT32dgWc3gvDqKk2duM1KzkQ+meXAkM90u/VLDTURo6pYyK oCdVoHTRQRUCcAQnNNUCQQCO/zDRaY+5ssjPqj77eJqWfAhtbSDRRw+NurmUSas1 FT1cD5nil+uT48bIRoC5nk/XWfvAvMg/Yw5bslGUNx7f -----END RSA PRIVATE KEY-----"; $public_key = "-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpS7mxdU6svbDcs10qbq9f9t5D 4yfqC1jLmZD3GDD4D/8TbNkfvcYDvde6nyPRSxrnzl9YmZhJKlP2iCIwdwwmW6yu lXZyvPurfN/1AJt4JYDxnN/qu1bSG5DZMribLsR2dlfA5J0D6lQ7g40eSgp4D6UW y8ezLy6UWFQCrnUHEQIDAQAB -----END PUBLIC KEY-----"; //获取全部支持算法,cipher 就是密码,算法计算的意思 $methods=openssl_get_cipher_methods(); // var_dump($methods); $data="原始数据为: 用私钥加密origin data1"; $method="AES-128-CBC"; //经过私钥加密,生成$crypted; openssl_private_encrypt($data, $crypted, $private_key); // 因为php 进行openssl_public_encrypt 加密后返回的是二进制数据,须要对其返回的加密后的数据进行二进制16进制编码base64_encode才能够显示,$crypted为加密后的串 $crypted=base64_encode($crypted); echo "私钥加密后的结果为:".$crypted."\n"; //相应的:加密后生产的16进制加密字符串须要进行base64_decode进行解密后在进行openssl_private_decrypt $crypted=base64_decode($crypted); openssl_public_decrypt($crypted, $decrypted , $public_key); echo "用公钥解密的结果为".($decrypted)."\n"; echo"===================我是分割线==============\n"; $data="用公钥加密origin data2\n"; $method="AES-128-CBC"; //经过公钥加密,生成$crypted; openssl_public_encrypt($data, $crypted, $public_key); // 因为php 进行openssl_public_encrypt 加密后返回的是二进制数据,须要对其返回的加密后的数据进行二进制16进制编码base64_encode才能够显示,$crypted为加密后的串 $crypted=base64_encode($crypted); echo "公钥加密后的结果为:".$crypted."\n"; //相应的:加密后生产的16进制加密字符串须要进行base64_decode进行解密后在进行openssl_private_decrypt $crypted=base64_decode($crypted); openssl_private_decrypt($crypted, $decrypted , $private_key); echo "用私钥解密的结果为".($decrypted)."\n";
不知道具体参数有哪些,能够这样简单看一下。
openssl rsa --h
unknown option --h
rsa [options] <infile >outfile
where options are
-inform arg input format - one of DER NET PEM
-outform arg output format - one of DER NET PEM
-in arg input file
-sgckey Use IIS SGC key format
-passin arg input file pass phrase source
-out arg output file
-passout arg output file pass phrase source
-des encrypt PEM output with cbc des
-des3 encrypt PEM output with ede cbc des using 168 bit key
-seed encrypt PEM output with cbc seed
-aes128, -aes192, -aes256 encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256 encrypt PEM output with cbc camellia
-text print the key in text
-noout don't print key out
-modulus print the RSA key modulus
-check verify key consistency
-pubin expect a public key in input file
-pubout output a public key
-engine e use engine e, possibly a hardware device.
appuuid AppPublicKey aeskey xxoo asdfasd!#@ rrrr ddeef ujoi!@#!@¥ rrrr
至此第一次aeskey算是握手部分完成。这样的好处是只有反编译以后,才能拿到ServerPublicKey。
6.下次app再向服务端发送请求,将数据用约定好的(固然用如下5,6的步骤能够随机生成)aeskey加密,。
7.服务端用步骤4中的已知aeskey解密app端的发送过来的数据后,再用一样的aes能够解开便可。
8.另外服务端主动推送的时候,也能够用那个共有的aeskey加密后推送数据
若是要作到更好(有必要吗):
从第5步应该这样:
5.客户端传递三个自定义字段:一个为用ServerPublicKey 加密的aeskey,另外一个为uuid,另外为真正的data
6,服务端用ServerPrivateKey能够解开uuid,而后去数据库中查到到每一个uuid对应的不一样aeskey,而后用这个数据aes去加密数据
另外若是须要验证一致性仍然能够用hash签名。