2016-07-13 10 views
0

私は、PHPで書かれたSendy(sendy.co)にOffice365配布リストを同期するC#の統合を開発中です。PHP openssl_encrypt C#の実装

PHPアプリケーションでは、いくつかのIDが暗号化されており、C#で同じことを達成したいので、「秘密」IDを調べなくてもAPIを使用して通信できます。

これは、これらのIDを算出し、そのアプリケーションでは、PHPのコード(私はパスワードを置き換え)です:私はどこかのPHPスクリプトをホストしているし、私のC#アプリケーションからそれを呼び出すことによって、この「問題」を克服

$encrypted = openssl_encrypt($in, 'AES-256-CBC', 'API_KEY', 0, 'SECRET_PASSWORD'); 
$encrypted = str_replace('/', '892', $encrypted); 
$encrypted = str_replace('+', '763', $encrypted); 
$encrypted = str_replace('=', '', $encrypted); 

しかし、私はそれをオープンソースにしたいので、これをアプリケーションに統合したいと思っています。

私は.NETのAesCryptoServiceProviderで始める必要があると思いますが、それを正しく得ることができないようです(キーの長さやものに関する例外があります)。

public static string Execute() 
    { 
     // openssl_encrypt (string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]]) 
     var aes = new AesCryptoServiceProvider(); 
     aes.KeySize = 256; 

     // Fixed password in code 
     aes.Key = Encoding.UTF8.GetBytes("FIXED PASSWORD"); 
     // API = IV 
     aes.IV = Encoding.UTF8.GetBytes("SENDY API KEY"); 

     aes.Mode = CipherMode.CBC; 

     // Trying to encrypt "36" in this case 
     byte[] src = Encoding.Unicode.GetBytes("36"); 

     // Actual encryption 
     using (var encrypt = aes.CreateEncryptor()) 
     { 
      byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length); 

      // Convert byte array to Base64 strings 
      return Convert.ToBase64String(dest); 
     } 
    } 

しかし、これはIVは、アルゴリズムのブロックサイズと一致していないと言って例外をスロー:

は、これまでのところ、私はこれを試してみました。

私は、PHPの派生物の例で与えられたAPI KEY(実際には$ passwordパラメータ)から実際のIVを導出すると仮定しますが、Cで同じことを達成するための多くのドキュメンテーションを見つけることができません# 。

+0

コードは、私たちはコードを必要とする総合的なソリューションを使用することを検討することは困難です。 SOはあなたのコードを書くことではなく、コードを手伝うことです。詳細な問題とデバッグ出力とともに試行されたコードを追加してください。 – zaph

+0

Base64の面倒な文字に対処するより良い方法があります。 '892'と '763'の両方が有効なBase64シーケンスになります。典型的には、必要に応じてURLだけがURLをエンコードします。定数を使うことは悪い考えであり、安全ではありません。 – zaph

+0

はい、私はPHPコードが良い習慣ではないが、私はそれを書いていないと私のアプリケーションではないことを理解することができます、私はちょうどPHPで同じを達成する必要があります。 "試行する"コードを削除しましたが、私は試してみます。 –

答えて

0

ivのサイズは、AESが16バイトの場合、"SENDY API KEY"が13バイトのみであるブロックサイズと等しくなければなりません。

ivは、各暗号化ごとに異なるランダム値である必要があります。復号化時に使用する暗号化データの前に付加します。

次に、256ビットのキーサイズを指定しましたが、"FIXED PASSWORD"のキーは14バイトのみで、同じ128,192または256ビット(16,24または32バイト)にします。 128ビットを超えるキーを使用する必要はありません。

パスワードを直接キーに使用しないでください。パスワードは、PBKFD2などの機能を使用してパスワードから取得する必要があります。

AESはブロック暗号です。入力は、ブロックサイズの倍数でなければなりません。これを達成するには、入力のパディングが必要です。通常、PKCS#7(néePKCS#5)のパディングが使用されますが、これはおそらくOpenSSLのデフォルトです。暗号化/復号化は、このパディングを自動的に追加/削除する必要があります。しかしこれは、暗号化されたデータの長さが入力よりも1バイトから16バイト長いことを意味します。例えば"36"を暗号化すると、出力の長さは16バイトになります。

正しく一緒にこのすべてを取得する、正しい取得などRNCryptor-phpdefuse