非對稱加密openssl協議在php7實踐

来源:https://www.cnblogs.com/wscsq789/archive/2019/10/03/11620733.html
-Advertisement-
Play Games

據網上資料,RSA加密演算法是一種非對稱加密演算法。在公開密鑰加密和電子商務中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(RON RIVEST)、阿迪·薩莫爾(ADI SHAMIR)和倫納德·阿德曼(LEONARD ADLEMAN)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們 ...


      據網上資料,RSA加密演算法是一種非對稱加密演算法。在公開密鑰加密和電子商務中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(RON RIVEST)、阿迪·薩莫爾(ADI SHAMIR)和倫納德·阿德曼(LEONARD ADLEMAN)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。

    工作中經常會出現對敏感數據加解密的需要,比如自己當前金融公司涉及到的用戶交易數據,用戶身份識別驗證等。這裡有關用戶身份識別的用到了RSA加密演算法。php這裡用到了openss協議。

    非對稱加密即是私鑰加密需用公鑰解密;公鑰加密的需用私鑰解密;公鑰和私鑰是成對出現,公鑰可以派發給所用人,私鑰只可服務端保留。

    下麵是php實現的openssl加解密部分示例代碼:

##伺服器是centos7
##首先確定伺服器是否安裝openssl協議(未安裝的請執行命令yum install -y openssl-devel): [root@iz2vcf47jzvf8dxrapolf7z test]# openssl version OpenSSL
1.0.2k-fips 26 Jan 2017 [root@iz2vcf47jzvf8dxrapolf7z test]# #生成私鑰文件rsa_private_key.pem文件 [root@iz2vcf47jzvf8dxrapolf7z test]# openssl genrsa -out rsa_private_key.pem 1024 Generating RSA private key, 1024 bit long modulus ..................................................++++++ ........................................................................++++++ e is 65537 (0x10001)
##私鑰轉成pkcs8模式(文末附各模式說明)
[root@iz2vcf47jzvf8dxrapolf7z test]# openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
##列印私鑰文件 [root@iz2vcf47jzvf8dxrapolf7z test]#
cat rsa_private_key.pem -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCh13gUKZWQlx7cuYQvY1A6JuJjArMax8yHcTrtcL+kpa5Cg6mD 609QNiTacuJxmh7Q/w+1Lw/cuWN0Q7s3s4WzJET6YCi3fH4zqVmpqWIcKWC/hE3p VV3lJsBvMpoz2bFn1eRwVtmSp4dVAqe542YvbZ13VGheEvkKi5uqWyhY1wIDAQAB AoGAIYSjjOFz5Wc28BXH55yU8AY/mqvjdidtF5v+zVAtkKbzqTjlcbnZSk58YXWr qkV2HmjE0wx1J4yJqXmhm46loLkIpWdQfzRyFFnK3xmo9Lc6jXbIrKmFYyN7FTqT 5cADvrTJ2jO9BlDG0ddTp7pl6dRi00jkrTRU3mgxZZ1kOWkCQQDRZZl9LKs+lz0v kOEKGuhjfHpFYpjce/mg0XfOZuFIqYXdm/nO1nx/KAr+xtUhiqkRzdxADOA0Nrxg alCtT1NbAkEAxdxotvcFYKOFES1aOAg35mv7Inlnjelbj1Jx0wtGRVUV/0nvMVKf TLInECD2mUaE00OWjuXanAI2FQQWbML1NQJBAL/AGDRGaXJhsIgUVd+ZEGG6JYXQ akbNyKR57Qo3r+mIQ6vSH4pHY65VjuwMTDPw9C33o8+LeuyVix+He+WZFK0CQQDA Gb+9LFYXPou6Yqr+TdRgLiSUkwScfp27qBMFESQ3umVyB8lovMwXPby5ZxelNxdM uolZ0gaOg4MYonBXRm2lAkAEOjH32XMSTB+HI+lQrLCFiumyRjHpgbRgTcyUQolY fjR63M0E/rzVIneKPqLP+ySOYLFcO3bjuMa75CQic8PF -----END RSA PRIVATE KEY-----


 ##根據私鑰得到相應的公鑰
 [root@iz2vcf47jzvf8dxrapolf7z test]# openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
 writing RSA key
 [root@iz2vcf47jzvf8dxrapolf7z test]# cat rsa_public_key.pem
 -----BEGIN PUBLIC KEY-----
 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh13gUKZWQlx7cuYQvY1A6JuJj
 ArMax8yHcTrtcL+kpa5Cg6mD609QNiTacuJxmh7Q/w+1Lw/cuWN0Q7s3s4WzJET6
 YCi3fH4zqVmpqWIcKWC/hE3pVV3lJsBvMpoz2bFn1eRwVtmSp4dVAqe542YvbZ13
 VGheEvkKi5uqWyhY1wIDAQAB
 -----END PUBLIC KEY----- ##新建openssl.php
[root@iz2vcf47jzvf8dxrapolf7z test]# cat openssl.php

<?php
/**
 * 私鑰加密/公鑰解密
 *
 * @param $str string 待加解密字元串
 * @param $isEncrypt boolean
 * return string|null
 */
 function opensslPrivateEncrypt($str, $isEncrypt = true)
 {

  if($isEncrypt){
    $privateKey = file_get_contents('./rsa_private_key.pem');
    $privateKey = openssl_pkey_get_private($privateKey);

    return openssl_private_encrypt($str, $encryptedStr, $privateKey)
      ? base64_encode($encryptedStr) : null;
  }else{
    $publicKey = file_get_contents('./rsa_public_key.pem');
    $publicKey = openssl_pkey_get_public($publicKey);

    return (openssl_public_decrypt(base64_decode($str), $decryptedStr, $publicKey))
    ? $decryptedStr : null;
  }
}

/**
 * 公鑰加密/私鑰解密
 *
 * @param $str string 待加解密字元串
 * @param $isEncrypt boolean
 * return string|null
 */
function opensslPublicEncrypt($str , $isEncrypt = true)
{

  if($isEncrypt){
    $publicKey = file_get_contents('./rsa_public_key.pem');
    $publicKey = openssl_pkey_get_public($publicKey);

    return openssl_public_encrypt($str, $encryptedStr, $publicKey)
      ? base64_encode($encryptedStr) : null;
  }else{
    $privateKey = file_get_contents('./rsa_private_key.pem');
    $privateKey = openssl_pkey_get_private($privateKey);

    return (openssl_private_decrypt(base64_decode($str), $decryptedStr, $privateKey))
      ? $decryptedStr : null;
  }
}

$config = array();
$config['title'] = 'PHP is the best program language.';
$config['comment'] = 'PHPERS are great people.';

$privateEncrypt = opensslPrivateEncrypt(json_encode($config));
echo("##privateEncrypt is:" . PHP_EOL);
echo($privateEncrypt . PHP_EOL);
$privateDecrypt = opensslPrivateEncrypt($privateEncrypt, false);
echo("##privateDecrypt is:" . PHP_EOL);
echo($privateDecrypt . PHP_EOL);

$publicEncrypt = opensslPublicEncrypt(json_encode($config));
echo("##publicEncrypt is:" . PHP_EOL);
echo($publicEncrypt . PHP_EOL);
$publicDecrypt = opensslPublicEncrypt($publicEncrypt, false);
echo("##publicDecrypt is:" . PHP_EOL);
echo($publicDecrypt . PHP_EOL);

##執行腳本
[root@iz2vcf47jzvf8dxrapolf7z test]# php openssl.php

##privateEncrypt is:
mLrLIAwbwlE69Yj5/lnNw1t8qSjhnFa+96s/kSMYweAn/HEsV7jfVAJ6mn/FY2DRRWkKeOnguUYsRcFTBcS1ieG7UtqbUAASXA5dwVgtTrFoDcDhHMl7p90+dIO8n+vMoBx1kkUegpvtH03y3MgUVSj/BLkLE8jrFXyjGufIcv0=
##privateDecrypt is:
{"title":"PHP is the best program language.","comment":"PHPERS are great people."}
##publicEncrypt is:
NW2k5m2pKrZmEMSHXiK7mfyC+yDjH1+b6TrEMPv+ywBfsUlo2P8eWwcXOQxvsV4UG87a1S4Xa2QySntdEwhpYoim97457ODVVCb6jx+cqqdWJ1wlLS+gx7FJxw7Z0kMPmCm5iMcQwWPK+UzF+dpc/gJFa9uGAAmYczUumOauAx0=
##publicDecrypt is:
{"title":"PHP is the best program language.","comment":"PHPERS are great people."}

pkcs標準:

PKCS標準彙總
 版本名稱簡介
PKCS #1 2.1 RSA密碼編譯標準(RSA Cryptography Standard) 定義了RSA的數理基礎、公/私鑰格式,以及加/解密、簽/驗章的流程。1.5版本曾經遭到攻擊。
PKCS #2 - 撤銷 原本是用以規範RSA加密摘要的轉換方式,現已被納入PKCS#1之中。
PKCS #3 1.4 DH密鑰協議標準(Diffie-Hellman key agreement Standard) 規範以DH密鑰協議為基礎的密鑰協議標準。其功能,可以讓兩方通過金議協議,擬定一把會議密鑰(Session key)。
PKCS #4 - 撤銷 原本用以規範轉換RSA密鑰的流程。已被納入PKCS#1之中。
PKCS #5 2.0 密碼基植加密標準(Password-based Encryption Standard) 參見RFC 2898與PBKDF2
PKCS #6 1.5 證書擴展語法標準(Extended-Certificate Syntax Standard) 將原本X.509的證書格式標準加以擴充。
PKCS #7 1.5 密碼消息語法標準(Cryptographic Message Syntax Standard) 參見RFC 2315。規範了以公開密鑰基礎設施(PKI)所產生之簽名/密文之格式。其目的一樣是為了拓展數字證書的應用。其中,包含了S/MIMECMS
PKCS #8 1.2 私鑰消息表示標準(Private-Key Information Syntax Standard). Apache讀取證書私鑰的標準。
PKCS #9 2.0 選擇屬性格式(Selected Attribute Types) 定義PKCS#6、7、8、10的選擇屬性格式。
PKCS #10 1.7 證書申請標準(Certification Request Standard) 參見RFC 2986。規範了向證書中心申請證書之CSR(certificate signing request)的格式。
PKCS #11 2.20 密碼設備標準介面(Cryptographic Token Interface (Cryptoki)) 定義了密碼設備的應用程式介面(API)之規格。
PKCS #12 1.0 個人消息交換標準(Personal Information Exchange Syntax Standard) 定義了包含私鑰與公鑰證書(public key certificate)的文件格式。私鑰採密碼(password)保護。常見的PFX就履行了PKCS#12。
PKCS #13 橢圓曲線密碼學標準(Elliptic curve cryptography Standard) 制定中。規範以橢圓曲線密碼學為基礎所發展之密碼技術應用。橢圓曲線密碼學是新的密碼學技術,其強度與效率皆比現行以指數運算為基礎之密碼學演算法來的優秀。然而,該演算法的應用尚不普及。
PKCS #14 擬隨機數產生器標準(Pseudo-random Number Generation) 制定中。規範擬隨機數產生器的使用與設計。
PKCS #15 1.1 密碼設備消息格式標準(Cryptographic Token Information Format Standard) 定義了密碼設備內部數據的組織結構。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一次寫博客,正好在回顧Java的時候用到了比較器,記錄一下使用的方法。 Java比較器多用於對象數組的排序,主要用到comparable和comparator介面 1、使用comparable介面 首先將需要實現排序對象的類實現comparable介面,實現後覆寫comparaTo(T other ...
  • 1、HashMap源碼解析(JDK8) 基礎原理: 對比上一篇《Java中的容器(集合)之ArrayList源碼解析》而言,本篇只解析HashMap常用的核心方法的源碼。 HashMap是一個以鍵值對存儲的容器。 hashMap底層實現為數組+鏈表+紅黑樹(鏈表超過8時轉為紅黑樹,JDK7為數組+鏈 ...
  • 我們將生產者、消費者、庫存、和調用線程的主函數分別寫進四個類中,通過搶奪非線程安全的數據集合來直觀的表達在進行生產消費者模型的過程中可能出現的問題與解決辦法。 我們假設有一個生產者,兩個消費者來共同搶奪庫存里的資源,而生產者和消費者都以線程來實現。 庫存對象只有是唯一的才會出現搶奪一個資源的可能,所 ...
  • vue實現選擇圖片文件後預覽 利用h5的api可以實現選擇文件並實現預覽 readAsDataURL 方法會讀取指定的 Blob 或 File 對象。讀取操作完成的時候,readyState 會變成已完成DONE,並觸發 loadend 事件,同時 result 屬性將包含一個data:URL格式的 ...
  • 面向對象三大特性:封裝、繼承、多態 繼承的概念: 在定義類時,可以從已有類當中提取想要的內容 被繼承的類稱為父類、基類、超類,新定義的類稱為子類、派生類 註意:如果派生類中的屬性與基類屬性重名,那麼派生類的屬性會覆蓋掉基類的屬性。包括初始化函數。 派生類在初始化函數中需要繼承和修改初始化過程,使用’ ...
  • T1 動態逆序對 題目 【題目描述】 給出一個長度為n的排列a(1~n這n個數在數列中各出現1次)。每次交換兩個數,求逆序對數%2的結果。 逆序對:對於兩個數a[i],a[j](i<j),若a[i]>a[j],則(a[i],a[j])為1個逆序對。 【輸入格式】 第一行一個正整數n。 接下來一行n個 ...
  • 正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。 一、元字元 1) . --匹配任意字元(不包括換行符) 2) ^ --匹配開始位置,多行模式下匹配每一行的開始 3) $ --匹配結束位置,多行模式下匹配每一行的結束 4) * --匹配前一個元字元0到多次 5) + ...
  • 目錄 php常用自定義函數類下載 php 設置字元編碼為utf-8 GB2312和utf8相互轉換 路徑格式化(替換雙斜線為單斜線) 獲取當前文件的目錄 列印輸出 api返回信息 字元串截取 方法一: 方法二: 字元串make_by_id轉成makeById 數組 字元串 對象 json格式的字元串 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...