簡體   English   中英

用公鑰加密密碼(RSA)

[英]Encrypt password (RSA) with public key

我在希望通過簡單調用PHP的openssl_public_encrypt();遇到嚴重問題openssl_public_encrypt();

不幸的是,我收到無效的公共密鑰警告。

我的目標是使用他們的API提供的公共密鑰簡單地RSA加密用戶密碼,當前看起來像這樣:

+ Tir6 + unMOaQ5tHqjjjwnlAMhccnCSMFEi3a0mhIxbW + O / GukjomGyzckQT2h0Ys70JezHbNq5YS3sYkNF29kCkz4HuNfy9eEjE / clA9 / zyfT8ZcbnusLcLz2xNgbTp62fQdzBnReI5 + DPJ / N24krYvHaYIr8ACxDqBv2TR3E9M = AQAB

顯然,使用我要使用的同一服務的有效實現找到了以下步驟的解決方案:

  1. 從公鑰中提取模數和指數
  2. 重新構造MS PUBLICKEYBLOB格式的密鑰
  3. 調用OpenSSL將密鑰轉換為PEM格式
  4. 從轉換后的文件中加載PEM公鑰
  5. 加密密碼(轉換為UTF-16LE后)

但是,不僅我不知道是否可以在PHP中進行操作,我還認為必須有一種更簡單的方法!

我看到的一篇帖子暗示指數可能在最后一個=符號(即AQAB)之后,但我不知道這是否可靠。

這樣的事情您想要做什么?

<?php
$key = '+Tir6+unMOaQ5tHqjjjwnlAMhccnCSMFEi3a0mhIxbW+O/GukjomGyzckQT2h0Ys70JezHbNq5YS3sYkNF29kCkz4HuNfy9eEjE/clA9/zyfT8ZcbnusLcLz2xNgbTp62fQdzBnReI5+dpj/N24krYvHaYIr8ACxDqBv2TR3E9M=AQAB';

include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(array(
    'e' => new Math_BigInteger(65537),
    'n' => new Math_BigInteger(substr($key, 0, -4), -256)
));
$ciphertext = $rsa->encrypt('password');

echo bin2hex($ciphertext);
?>

本示例使用phpseclib(純PHP RSA實現) 盡管phpseclib不支持您發布的密鑰格式,但它確實支持原始公共密鑰,因此不需要轉換為PKCS1樣式密鑰。 phpseclib產生的密文可以與OpenSSL完美地互操作

好的,所以您需要執行以下操作:

  1. 刪除AQAB部分,並將值65537用於公共指數
  2. base 64解碼模數
  3. 以PKCS#1格式創建公共密鑰的DER編碼(請參見下文)
  4. base64使用64個字符的行長和DOS行尾對DER編碼進行編碼
  5. 添加PEM頁眉和頁腳
  6. 使用PEM編碼的字符串創建公共密鑰,最后
  7. 加密密碼

以下ASN.1規范以PKCS#1格式定義了公鑰:

RSAPublicKey ::= SEQUENCE {
      modulus           INTEGER,  -- n
      publicExponent    INTEGER   -- e
}

現在SEQUENCE的標識符八位位組或標記的十六進制為30 ,INTEGER為02 ,長度應像這樣指定。 這樣您會得到類似:

30818902818100F938ABEBEBA730E690E6D1EA8E38F09E500C85C727092305122DDAD26848C5B5BE3BF1AE923A261B2CDC9104F687462CEF425ECC76CDAB9612DEC624345DBD902933E07B8D7F2F5E12313F72503DFF3C9F4FC65C6E7BAC2DC2F3DB13606D3A7AD9F41DCC19D1788E7E7698FF376E24AD8BC769822BF000B10EA06FD9347713D30203010001

以十六進制表示。 因此,在以base 64編碼並添加頁眉和頁腳行之后,您應該獲得:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQH5OKvr66cw5pDm0eqOOPCeUAyFxycJIwUSLdrSaEjFtb478a6SOiYbLNyRBPaHRizvQl7Mds2rlhLexiQ0Xb2QKTPge41/L14SMT9yUD3/PJ9Pxlxue6wt
wvPbE2BtOnrZ9B3MGdF4jn52mP83biSti8dpgivwALEOoG/ZNHcT0wIDAQAB
-----END RSA PUBLIC KEY-----

快樂的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM