一、常用加密類型分類
1、對稱加密:采用單鑰對信息進行加密和解密,即同一個秘鑰既可以對信息進行加密,也可以進行解密。此類型稱之為對稱加密。特點速度快,常用於對大量數據信息或文件加密時使用。常用例子:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES。
2、非對稱加密:采用公鑰和私鑰雙鑰形式對信息進行加密和解密,其中公鑰和私鑰是成對存在的,即使用公鑰對信息加密后的密文只用使用其相應的私鑰才可以進行解密,反之也毅然。相對對稱加密而言叫做非對稱加密。安全性非常好,但加密和解密耗時較長,比較適用於小數據量加密解密。常用例子:數字簽名、RSA。
加密介質 公鑰私鑰對或者證書
公鑰加密 私鑰解密
私鑰簽名 公鑰驗簽
公鑰私鑰
一般格式是.pem的
公鑰內容(注意格式不能變) -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmA6wtOBV6O+zwfteu9fKrF1iA H1q28yMiWDsb2iScRG3JZJWsDz+hVP9Qp7w3Bzqkt0PaC+XNCFVGksqEXZ0lQGgQ vz4626ibXRt2eLOAgKIrUUbVTccQJhGhAOqFlPSgxdWx/B1cSRp73Lt89WfNISh/ /A81649guFe3PII2wwIDAQAB -----END PUBLIC KEY----- 私鑰內容 -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCmA6wtOBV6O+zwfteu9fKrF1iAH1q28yMiWDsb2iScRG3JZJWs Dz+hVP9Qp7w3Bzqkt0PaC+XNCFVGksqEXZ0lQGgQvz4626ibXRt2eLOAgKIrUUbV TccQJhGhAOqFlPSgxdWx/B1cSRp73Lt89WfNISh//A81649guFe3PII2wwIDAQAB AoGAOggcnq31LAZYm/Tq9jj5O/9sK1VKg5tYU8Ad4W2O0KVG71hezYeDCaVJnmsT 6vR29m8to8H28YYRMRtM+ZozvOp1Tk6t+Ng+fcFt8I/bzb+ncq/gznm01gOZ0ihp zljIhsmH4v7Cnp5/WNkdbrwR0XAXqgIGcMQhENCvQy5WeTECQQDa0XCgC0iTeL5V MhR4SuZRxHACs7iDuoppDWsu0VgPS+mVrO8Fb2574aR/8y8q5NwJ5XZpG3p+Iie7 CNipZtnZAkEAwjlGbFLEFWT5/DzQFdZlx7A8YbM8UYEnxA7t7nt730UcDML3QPNO 3QMe8Srdrm9B7eRl75t0atjhOgIF26U3+wJBAIVX9hsBZUPA47PFJeY8NmiDnYJ4 BKv5hBkKfVN1bQU9TGXSkYGtaxWA5p62EftApbo+I89fWGD+7VkzxdxNedkCQATh iZqJTfI3smybXqNd2vr0u9+8sGRf+Y7czS/0HH3U78qGT85rDu1Q+cMXz7BljWOc HM+zuW5B+w8JI/qMIWcCQDEB/MsM4THgEQIuHStNJw2knA2ah3kQi6jESMQbGflK YKJlRNwrz+FfwIWQAo1XVf9IdmNjVsDXXosQKInIPZo= -----END RSA PRIVATE KEY-----
證書規范
證書也是用加密解密算法,只不過多了一些認證參數,比如國家地區等
x509,公鑰證書,只有公鑰。
p7,簽名或加密。可以往里面塞x509,同時沒有簽名或加密內容。
p12,含有私鑰,同時可以有公鑰,有口令保護。
p7的作用就是電子信封。
X509是基本規范
P7和P12是兩個實現規范,P7是數字信封,P12是帶有私鑰的證書規范。
x509是數字證書的規范,P7和P12是兩種封裝形式。比如說同樣的電影,有的是avi格式,有的是mpg,大概就這個意思。
P7一般是把證書分成兩個文件,一個公鑰一個私鑰,有PEM和DER兩種編碼方式。PEM比較多見,就是純文本的,P7一般是分發公鑰用,看到的就是一串可見字符串,擴展名經常是.crt,.cer,.key等。DER是二進制編碼。
P12是把證書壓成一個文件,.pfx。主要是考慮分發證書,私鑰是要絕對保密的,不能隨便以文本方式散播。所以P7格式不適合分發。.pfx中可以加密碼保護,所以相對安全些。
在實踐中要中,用戶證書都是放在USBKey中分發,服務器證書經常還是以文件方式分發。服務器證書和用戶證書,都是X509證書,就是里面的屬性有區別。
X509 是證書規范
PKCS#7 是消息語法 (常用於數字簽名與加密)
PKCS#12 個人消息交換與打包語法 (如.PFX .P12)打包成帶公鑰與私鑰
看着有點費勁。。只需要記住x509就是個公鑰,pkcs12就是私鑰,和私鑰不同的是這個私鑰是加密的,需要密碼才能獲取到私鑰內容
總結以上證書和密鑰都可以對數據進行加密解密以及驗簽,只是使用的方式不同而已。。。
公私鑰的生成
(也可以在linux用openssl命令生成)
//生成密鑰 $config = array( "digest_alg" => "sha512", "private_key_bits" =>2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); //創建密鑰對 $res = openssl_pkey_new($config); //生成私鑰 openssl_pkey_export($res,$priKey); //生成公鑰 $pubKey = openssl_pkey_get_details($res)['key']; file_put_contents('private.key',$priKey); file_put_contents('public.key',$pubKey);
證書的生成
$dn = array( "countryName" => "GB", "stateOrProvinceName" => "Somerset", "localityName" => "Glastonbury", "organizationName" => "The Brain Room Limited", "organizationalUnitName" => "PHP Documentation Team", "commonName" => "Wez Furlong", "emailAddress" => "wez@example.com" ); $config = array( "digest_alg" => "sha512", "private_key_bits" =>2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); //創建密鑰對 $res = openssl_pkey_new($config); //證書 $csr = openssl_csr_new($dn,$res); //證書簽名 $usercert = openssl_csr_sign($csr, null, $res, 365); //導出證書公鑰 openssl_x509_export_to_file($usercert,'csr.public.cert'); //導出證書私鑰 openssl_pkcs12_export_to_file($usercert,'csr.private.pfx',$res,'123');
rsa的公私鑰加密解密
//公鑰加密 //$pubKey = file_get_contents('public.key'); //返回資源型的 $pubKey = openssl_pkey_get_public(file_get_contents('public.key')); openssl_public_encrypt('123456',$crypted,$pubKey,OPENSSL_PKCS1_PADDING); base64_encode($crypted); //私鑰解密 //$priKey = file_get_contents('private.key'); //返回資源型的 $priKey = openssl_pkey_get_private(file_get_contents('private.key')); $crypted = base64_decode($crypted); openssl_private_decrypt($crypted,$decrypted,$priKey,OPENSSL_PKCS1_PADDING);
//參數的意義: 密文數據, 加密解密后的數據,密鑰,加密解密的填充
證書的加密解密
//加密 $pubKey = file_get_contents('csr.public.cert'); $pubKey = openssl_x509_read($pubKey); openssl_public_encrypt('1234',$crypted,$pubKey,OPENSSL_PKCS1_PADDING);
//參數的意義: 密文數據, 加密解密后的數據,密鑰,加密解密的填充
$data = base64_encode($crypted); //解密 $data = base64_decode($data); openssl_pkcs12_read(file_get_contents('csr.private.pfx'),$priKey,'123'); openssl_private_decrypt($data,$decrypt,$priKey['pkey'],OPENSSL_PKCS1_PADDING);
//參數的意義: 密文數據, 加密解密后的數據,密鑰,加密解密的填充
簽名以及驗簽(證書以及密鑰一樣的)
//簽名 openssl_sign($crypted, $sign, $priKey, OPENSSL_ALGO_SHA1); //驗簽 $res = openssl_verify($crypted, $sign, $pubKey,OPENSSL_ALGO_SHA1);
另一種驗簽MD5或者sha1
//對請求的字符串進行加密 當做簽名 發送過去 $username = 'liudehua'; $age = 23; $stamp = time(); $str = ['username'=>$username,'age'=>$age,'stamp'=>$stamp]; //字典排序 ksort($str); $str = http_build_query($str); $sign = md5($str); $str .='&sign='.$sign; echo $str; //接受到數據后開始進行驗簽 $age = $_GET['age']; $stamp = $_GET['stamp']; $username = $_GET['username']; $sign = $_GET['sign']; $str = ['age'=>$age,'stamp'=>$stamp,'username'=>$username]; ksort($str); $str = http_build_query($str); $check_sign = md5($str); echo $sign; echo '<br>'; echo $check_sign;
轉: http://lampol-blog.com/detail/aid/NzQ5NjhEVEJpcU9CV3hoRXRGZ1RxdmxmUFQ1bWNhcURrWFlGZHp6cQ%3D%3D
相關 : https://www.cnblogs.com/fps2tao/p/8685294.html
