[英]Encrypt password (RSA) with public key
我在希望通過簡單調用PHP的openssl_public_encrypt();
遇到嚴重問題openssl_public_encrypt();
不幸的是,我收到無效的公共密鑰警告。
我的目標是使用他們的API提供的公共密鑰簡單地RSA加密用戶密碼,當前看起來像這樣:
+ Tir6 + unMOaQ5tHqjjjwnlAMhccnCSMFEi3a0mhIxbW + O / GukjomGyzckQT2h0Ys70JezHbNq5YS3sYkNF29kCkz4HuNfy9eEjE / clA9 / zyfT8ZcbnusLcLz2xNgbTp62fQdzBnReI5 + DPJ / N24krYvHaYIr8ACxDqBv2TR3E9M = AQAB
顯然,使用我要使用的同一服務的有效實現找到了以下步驟的解決方案:
但是,不僅我不知道是否可以在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完美地互操作 。
好的,所以您需要執行以下操作:
AQAB
部分,並將值65537用於公共指數 以下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.