Взаимодействие RSA между VB.NET и PHP - PullRequest
0 голосов
/ 16 апреля 2011

Я использую OpenSSL с PHP для генерации открытого / закрытого ключа в формате PEM.

В PHP я создаю открытый / закрытый ключ:

// generate a 1024 bit rsa private key
$privateKey = openssl_pkey_new(array(
    'private_key_bits' => 1024,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
// Save Private key
openssl_pkey_export_to_file($privateKey, 'privateKey');

// get the public key 
$keyDetails = openssl_pkey_get_details($privateKey);
// Save Public key
file_put_contents('publicKey', $keyDetails['key']);

В VB.NET я кодирую это:

'Public Key
Dim sReader As String ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxYT5RaHelEBmk4Z7ppiVaPPBns/36sdY12F/AXETJVl2SYkjc672JMz ..... zQwIDAQAB"
Dim PublicKey As Byte() = Encoding.UTF8.GetBytes(sReader)
Dim Exponent As Byte() = {1, 0, 1}

    'Create a new instance of RSACryptoServiceProvider.
    Dim RSA As New RSACryptoServiceProvider()

    'Create a new instance of RSAParameters.
    Dim RSAKeyInfo As New RSAParameters()

    'Set RSAKeyInfo to the public key values. 
    RSAKeyInfo.Modulus = PublicKey
    RSAKeyInfo.Exponent = Exponent

    'Import key parameters into RSA.
    RSA.ImportParameters(RSAKeyInfo)

    'Create a UnicodeEncoder to convert between byte array and string.
    Dim ByteConverter2 As New UnicodeEncoding()

    'Create byte arrays to hold original, encrypted, and decrypted data.
    bytPlainText = Encoding.UTF8.GetBytes("Data to Encrypt")
    bytCipherText = RSA.Encrypt(bytPlainText, False)
    Dim sEncrypt99 As String = Convert.ToBase64String(bytCipherText)

Но я не могу расшифровать «sEncrypt99» в PHP с помощью закрытого ключа

Для теста я скопировал «sEncrypt99» в «$ encryptedData1»

<?php
$privateKey = openssl_pkey_get_private('file://privateKey');
openssl_private_decrypt(base64_decode($encryptedData1), $sensitiveData2, $privateKey);

echo "sensitiveData = " . $sensitiveData2 . "<br>";
?>

Никаких ошибок, $ sensData2 пусто.Странно .... Где проблема?

Рем: Извините за мой плохой английский, я француз;)

Ответы [ 2 ]

0 голосов
/ 12 сентября 2011

Я знаю, что эта тема немного устарела, но я пытаюсь сделать то же самое.Я столкнулся с проблемой с 'file: // privateKey'.Удалите его и используйте fopen или сохраните ключ в переменной.Работал на меня:)

0 голосов
/ 27 апреля 2011

Я бы проверил, что модуль и показатель степени совпадают между версией openssl открытого ключа и версией .NET.

Массив RSAParameters.Modulus должен быть ровно 128 байтов для 1024-битного ключа,У байтов DER может быть начальный нулевой байт, который составляет 129 байтов - убедитесь, что не , чтобы включить это.Этот массив .NET должен быть ровно 128 байтов (для 1024-битного ключа.)

Я бы выбросил открытый ключ из openssl и проверил массив.Например:

  1. Получить только открытый ключ из файла закрытого ключа на стороне PHP / OpenSSL:

    $ openssl rsa -in private-key.pem -pubout-out public-key.pem

  2. Разобрать открытый ключ с помощью openssl asn1parse:

    $ openssl asn1parse -in public-key.pem

    0: d = 0 hl = 3 l = 159 минусов: SEQUENCE
    3: d = 1 hl = 2 l = 13 минусов: SEQUENCE
    5: d = 2 hl = 2 l = 9 prim: ОБЪЕКТ: rsaEncryption

    16: d = 2 hl = 2 l = 0 прим: NULL
    18: d = 1 hl = 3 l = 141 прим: BIT STRING

  3. Разобрать BIT STRING, в котором есть действительный открытый ключ RSA (форма PKCS1 ASN.1):

    $ openssl asn1parse -in public-key.pem -strparse 18

        0:d=0  hl=3 l= 137 cons: SEQUENCE          
        3:d=1  hl=3 l= 129 prim: INTEGER           :B404886A7F0544C14AAE14EEE531A2D78122C9BFDB06E8C80433559A617FD159A05F8FD45500BBA63A1D07239C26BD8D32D3550D5DEAF7BF9C16D3E16BDE5A9BB56C378CB9E0E7DA9D3A5513482D74E1FDCCAC147D0E909D1B620598F710B437D50DE8F80D5F742B6DA6E2D2ED1BBEBF89A40546103A8451B59D8190633ACFA5
      135:d=1  hl=2 l=   3 prim: INTEGER           :010001
    

Этот массив, начиная с B4 04 88 ... (т.е. любое значение, которое вы видите для своего ключа), должен соответствовать байтовому массиву, который вы устанавливаете в параметрах RSAP.Я почти уверен, что этот порядок (т.е. порядок DER) - это то, что вы найдете в массиве модулей RSACryptoServiceProvider (то есть [0] = 0xb4, [1] = 0x04 и т. Д.). Также вы можете проверить показатель степени (второе целое число)показано выше как 01 00 01.)

...