私は立ち往生しています。 PHPで行われたAESの暗号化は、Windowsで解読できないようです。PHPの暗号化とWindowsの復号化
PHPコード:
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,"12345678", "test", MCRYPT_MODE_CBC));
Windowsコード: "s" はbase64でから戻って変換した後に上記の応答によって作成された文字列を持っています。
bool Decrypt(char* s,char* key,char* dest)
{
// Create the crypto provider context.
HCRYPTPROV hProvider = NULL;
if (!CryptAcquireContext(&hProvider,
NULL, // pszContainer = no named container
MS_ENH_RSA_AES_PROV, // pszProvider = default provider
PROV_RSA_AES,
0))
return false;
// Construct the blob necessary for the key generation.
aes128keyBlob aes_blob128;
aes_blob128.header.bType = PLAINTEXTKEYBLOB;
aes_blob128.header.bVersion = CUR_BLOB_VERSION;
aes_blob128.header.reserved = 0;
aes_blob128.header.aiKeyAlg = CALG_AES_128;
aes_blob128.keySize = 16;
memcpy(aes_blob128.bytes, key, 16);
HCRYPTKEY hKey = NULL;
if (!CryptImportKey(hProvider,
(BYTE*)(&aes_blob128),
sizeof(aes_blob128),
NULL, //
0, //
&hKey)) {
...
}
// Set Mode
DWORD dwMode = CRYPT_MODE_CBC;
CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0);
DWORD length = 16;
BOOL X = CryptDecrypt(hKey,
NULL, // hHash = no hash
TRUE, // Final
0,
(BYTE*)s,
&length);
//int le = GetLastError();
memcpy(dest,s,16);
CryptDestroyKey(hKey);
CryptReleaseContext(hProvider, 0);
}
何が間違っていますか?
どのように暗号化された文字列を渡していますか?クッキー、dbなど。 – solidau
Windowsプログラムに戻しますか?印刷を介して、それはブラウザの出力としてそれをとります。 – Michael
初期化ベクトル(IV)はどこで扱いますか? IVを設定しないと、PHPはすべてのバイトを ''\ 0' 'に設定したものを使います。あなたの解読ルーチンにそれを供給しているようには見えません。あなたは本当にIVを使うべきです、そうでなければCBCを捨てECBを使うかもしれません(もちろん、セキュリティを犠牲にして)。 – NullUserException