2016-05-26 7 views
1

暗号化/復号化が必要な第三者のコードセットがありましたが、私が与えたサンプル暗号化コードはC#であり、主にフロントエンドのPHP開発者です。PHPでC#暗号化/復号化をレプリケート

サンプルコードA818163DD5E0DE87を使用して、私は hereのコードのスリムな実例を設定しました。

public static byte[] HexStringToByteArray(String hex) 
{ 
int NumberChars = hex.Length; 
byte[] bytes = new byte[NumberChars/2]; 
for (int i = 0; i < NumberChars; i += 2) { 
bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
} 
return bytes; 
} 

// Convers a byte array to a HEX string 
public static string ByteArrayToHexString(byte[] bytes) 
{ 
StringBuilder hexString = new StringBuilder(bytes.Length * 2); 
for (int i = 0; i < bytes.Length; i++) 
{ 
hexString.Append(bytes[i].ToString("X2")); 
} 
return hexString.ToString(); 
} 

public static byte[] Encrypt() 
{ 
string plainText = "GROW06BP"; 
DESCryptoServiceProvider desCrypto = new DESCryptoServiceProvider(); 
desCrypto.Key = HexStringToByteArray("A818163DD5E0DE87"); 
desCrypto.IV = HexStringToByteArray("A818163DD5E0DE87"); 
desCrypto.Mode = CipherMode.CBC; 
desCrypto.Padding = PaddingMode.Zeros; 
// Create a buffer for the Plain Text using ASCIIEncoding 
byte[] plaintextBytes = (new ASCIIEncoding()).GetBytes(plainText); 
// Create a memory stream for the encrypted bytes 
MemoryStream msEncrypt = new MemoryStream(); 
// Create a CryptoStream using the memory stream and the passed Algorithm 
CryptoStream csEncrypt = new CryptoStream(msEncrypt, desCrypto.CreateEncryptor(), CryptoStreamMode.Write); 
// Write the plaintext to the CryptoStream 
csEncrypt.Write(plaintextBytes, 0, plaintextBytes.Length); 
// Close the CryptoStream 
csEncrypt.Close(); 
// Read the Encrypted bytes into our buffer 
byte[] encryptedTextBytes = msEncrypt.ToArray(); 
// Close the Memory Stream 
msEncrypt.Close(); 
// And return the encrypted buffer 
return encryptedTextBytes; 
} 

私はPHPでこれを再現する試みでスタックオーバーフローや他のサイトを洗い上げてきたが、何も正しい出力の近くに来ることはありません。私はまた、私が使用することを意図している暗号と、C#の例に一致するようにキーとivを変換する方法を混同しています。以下は私がこれまで試みたことです。

$key = unpack('H*', "A818163DD5E0DE87"); 
$key = "A818163DD5E0DE87"; 
$iv = $key; 
$plaintext = "GROW06BP"; 
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext,MCRYPT_MODE_CBC, $iv); 
echo base64_encode($ciphertext); 

助けてください。あなたが考慮する必要があり

+2

と同じ出力を生成します。彼らは異なった暗号化アルゴリズムです! – Nasreddine

答えて

0

もの:

  • DESCryptoServiceProvider - >は、mcrypt_module_open( '・デ'
  • desCrypto.Mode = CipherMode.CBC; - >は、mcrypt_module_open(...、...、 'CBC' 、
  • キー、IVおよび暗号出力がHexStringToByteArray(と "処理される")、pack('H*)は、.NETの出力が与えられると、だから

を取り消すことができ

<?php 
$msgHex = '7860D97E56DA6A40'; 
$keyHex = 'A818163DD5E0DE87'; 
$ivHex = 'A818163DD5E0DE87'; // really? invalidates the use-case of an iv :-/ 

// this reverts the effect of HexStringToByteArray() 
$msg = pack('H*', $msgHex); 
$key = pack('H*', $keyHex); 
$iv = pack('H*', $ivHex); 

// add error handing ! 
$module = mcrypt_module_open('des', '', 'cbc', ''); 
mcrypt_generic_init($module, $key, $iv); 
$plaintext = mdecrypt_generic($module, $msg); 
mcrypt_generic_deinit($module); 

echo $plaintext; 

出力につながるフィドル(7860D97E56DA6A40):私はすでに私のコメントで述べてきたようにGROW06BP

+0

VolkerKありがとうございました。これでコードを復号化することができます。私はこれを探しているときに私がそれらの機能を全く巡って来なかったので、これを得たとは思わない。 –

0

それはRijndaelのだから、あなたはあなたのPHPコードで間違ったアルゴリズムを使用しています。あなたが使うべきものはMCRYPT_DESです。

$key = "A818163DD5E0DE87"; 
// Here you need pack instead of unpack 
$packKey = pack("H*",$key); 
// you should use the key as the initialization vector 
// use something like mcrypt_create_iv to generate an IV 
$iv = $packKey; 
$plaintext = "GROW06BP"; 
// replaced MCRYPT_RIJNDAEL_128 with MCRYPT_DES 
$ciphertext = mcrypt_encrypt(MCRYPT_DES, $packKey, $plaintext,MCRYPT_MODE_CBC, $iv); 
echo base64_encode($ciphertext); 

これはDESを使用しているが、PHPで、あなたがラインダール(AES)を使用しているC#ではC#のコード

+0

Nasreddineのお手伝いをありがとう。あなたのコードは私にとってはすばらしいものですが、C#コードとは別の結果を出力するようですが、これは私の混乱の多くがここから来たものです。 –