Office365 配布リストを PHP で記述された Sendy (sendy.co) に同期する C# での統合を開発しています。
PHP アプリケーションでは、いくつかの ID が暗号化されています。「秘密の」ID を検索しなくても API を使用して通信できるように、C# でも同じことを実現したいと考えています。
これは、これらの ID を計算するアプリケーションの PHP のコードです (パスワードを置き換えました)。
$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);
PHPスクリプトをどこかにホストしてC#アプリケーションから呼び出すことでこの「問題」を克服しましたが、オープンソースにしたいので、これをアプリケーションに統合したいと考えています。
.NET の .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 の openssl_encrypt メソッドは、サンプル内の特定の API KEY から実際の IV を派生させていると思いますが (つまり、$password パラメーター)、C# で同じことを達成できるドキュメントはあまり見つかりません。