2017-04-18 5 views
1

私は暗号化C#コードを持っています。これはPHPとphpseclibで実装しようとしていて、まったく同じ結果を得ようとしています。それはRSAです。しかし、私はそれを行うことはできません。 PHPでエンコードされた空の文字列を返します。C#からPHPへの暗号化コード(phpseclib)

公開鍵は、この形式になります。

<?xml version="1.0" encoding="utf-16"?> 

<RSAParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Exponent>AQAB</Exponent> 
     <Modulus>sMFsHSyxAP5N85yvx/XDs9acJa30qwBjoOdDKvNOHJUYBpspwatkdtErCqM2W6tXH9rbvhIn8/nqW4OqAdLinlgkEJoQ/qnzKjYJhHl4YzKFL6Wp+iFRH6ar6ZWOE87LeNQ0nHwlXKoWkJQKV8NB38XRw6aLvNTj8Po2yaFDbQFztsJ+ILkumRh7Leu77IV+124Swc6JqLRt5z2FnDX869dRi2fqcnFa1EHEBsPEndVd2HSeJUncTQiWJ9SNRU+WLltVVewYiGheqr1ABab++3XM5qrB6fWn/RN9Fcg5nM8fachAFSX2YRrEsg7mcbNALRes6OEdpI0LBdX8Wdw6oQ==</Modulus> 
    </RSAParameters> 

C#コードは次のとおりです。私はこれをやっているPHPで

public static string Encrypt(string data, string public) 
    { 
     RSAParameters pubKey = public; 
     var csp = new RSACryptoServiceProvider(); 
     csp.ImportParameters(pubKey); 

     var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(data); 
     var bytesCypherText = csp.Encrypt(bytesPlainTextData, false); 
     return Convert.ToBase64String(bytesCypherText); 
    } 

が、空の文字列結果:

$rsa = new Crypt_RSA(); 
$modulus = new Math_BigInteger(($modulus), 16); 
$exponent = new Math_BigInteger(($exponent), 16); 
$rsa->loadKey(array('n' => $modulus, 'e' => $exponent)); 
$rsa->setPublicKey(array('n' => $modulus, 'e' => $exponent)); 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
$encryptedPassword = $rsa->encrypt($password); 

echo $encryptedPassword; 
+0

私はphp側で使用されているbigintegerクラスに精通していませんが、おそらくrsaparametersがビッグエンディアン表現で数字を保持していることに気付くでしょう...少なくともC#BigIntegerクラスでは、リトルエンディアンを期待しています... – DarkSquirrel42

+0

結果を基数64に変換するのを忘れていませんか?ランダムなバイナリバイトを印刷するのは良い考えではありません。 –

+0

@MaartenBodewes $ encryptedPasswordがnullであるため、変更されていません –

答えて

0

phpseclibは長年にわたってその形式のキーをネイティブサポートしています。 v0.2.2以来、https://github.com/phpseclib/phpseclib/releases/tag/0.2.2あたり、わずか5年前にリリースされました。

とにかく、これは私の仕事:

<?php 
include('Crypt/RSA.php'); 

$xml = '<RSAParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Exponent>AQAB</Exponent> 
     <Modulus>sMFsHSyxAP5N85yvx/XDs9acJa30qwBjoOdDKvNOHJUYBpspwatkdtErCqM2W6tXH9rbvhIn8/nqW4OqAdLinlgkEJoQ/qnzKjYJhHl4YzKFL6Wp+iFRH6ar6ZWOE87LeNQ0nHwlXKoWkJQKV8NB38XRw6aLvNTj8Po2yaFDbQFztsJ+ILkumRh7Leu77IV+124Swc6JqLRt5z2FnDX869dRi2fqcnFa1EHEBsPEndVd2HSeJUncTQiWJ9SNRU+WLltVVewYiGheqr1ABab++3XM5qrB6fWn/RN9Fcg5nM8fachAFSX2YRrEsg7mcbNALRes6OEdpI0LBdX8Wdw6oQ==</Modulus> 
    </RSAParameters>'; 

$rsa = new Crypt_RSA(); 
$rsa->loadKey($xml); 

$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
$encryptedPassword = $rsa->encrypt('password'); 

echo base64_encode($encryptedPassword); 

私はそれが働いていたよりもキーが、他から<?xml version="1.0" encoding="utf-16"?>ビットを削除する必要がありました。

+0

親愛なるneubert、@neubertあなたのスクリプトは実行として完璧に動作し、暗号化された文字列を提供します。しかし何らかの理由で、このキーをC#の暗号化で正しく復号化することはできません。つまり、暗号化アルゴリズムの何かがc#コードと異なることを意味します。 私はC#で暗号化アルゴリズム "RSA-PKCS1-KeyEx"を使用しています。 Rsa-pkcs1-keyexに基づいて提供されたコードに変更を加える必要がありますか? –

+0

あなたのコードを使用しているとします。結果はC#の暗号化と同じではありません。文字列を解読するためにはどのようなコードですか?私は解読のために必要な場合、塩、私的な、ベクトルデータを持っています。 –

+0

@Simos - 投稿したC#コードは暗号化用です。復号化ではありません。 PKCS1パディングについては、 'define( 'CRYPT_RSA_PKCS15_COMPAT'、true);'を試してみることをお勧めします。 – neubert