Bir Şifrelenmiş azalmak için Mcrypt Kullanma (3DES CBC Modu)

2 Cevap php

Ben 3DES CBC modunda şifreli bir şifreli var, ve ben bazı sorun şifresini yaşıyorum. Ben aşağıdaki bilgileri (gerçek değerler) var:

<?php
// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

// The initialisation vector
$ivec = '0102030405060708';

// A token which looks something like this
$token = '2ad82e09e3b4e7c491e4bb9fb7c606e1';
?>

I this blog post bulunan PHP Sınıf kapalı benim şifre çözme fonksiyonunu göre. Bu şuna benzer:

<?php
function decrypt($key,$iv,$token) {
    $td = mcrypt_module_open('tripledes', '', 'cbc', ''); 
    $iv = substr($iv, 0, mcrypt_enc_get_iv_size($td)); 
    $expected_key_size = mcrypt_enc_get_key_size($td); 

    $key = substr(md5($key), 0, $expected_key_size); 
    mcrypt_generic_init($td, $key, $iv);

    $decrypted_string = trim(mdecrypt_generic($td, base64_decode($token)));

    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    return $decrypted_string;
}
?>

Ancak, algoritma içine üç anahtar beslemek için nasıl emin değilim. .. Öyle gibi onları birbirine zincirleme denedim: $ anahtarı1 $ key2 $ key3, ve tersten, ama boşuna.

Herhangi bir yardım mutluluk duyacağız.

2 Cevap

// Three 16 character long keys
$ expected_key_size 24, 3 * 8'dir. Tuşları hex formatında muhtemeldir.

function foo($hex) {
    $rv = '';
    foreach(str_split($hex, 2) as $b) {
    	$rv .= chr(hexdec($b));
    }
    return $rv;
}

// Three 16 character long keys
$key1 = '1234567890123456';
$key2 = '6543210987654321';
$key3 = '6549873210456123';

$key = foo($key1.$key2.$key3);

Ben sonunda fonksiyonu ile sorun bulundu. Bu, anahtar dönüştürme Ivec ve Hex token, şifre çözme anahtarı MD5 hash kaldırılması ve sonuçta düz metin Base64 çözme çıkarmadan bir arada oldu.

Düz metin sonuçlandı dolgu karakteri biraz tuhaf oldu, ama bu rtrim () ile soyulduğu oluyor. Ayrıca şifreleme başlangıçta bazı standart Java kütüphaneleri kullanılarak JSP yapıldığını belirterek değer olabilir, bu nedenle bu Java Şifreleme → PHP şifre çözme giden herkes için yararlı olabilir.

Lütfen yardım VolkerK için teşekkürler, burada (Ben aşağıda eklememiş hex fonksiyonu dahil) kullanarak sona erdi fonksiyonu bulunuyor:

$algorithm = 'tripledes';
$key   = 'F123ACA...'; // Some hex key
$ivec  = 'FE12FA1...'; // Some hex ivec
$token = 'F2ACE12...'; // Some hex token
$mode  = 'cbc';

$key    = foo($key);
$ivec   = foo($ivec);
$token  = foo($token);

function decrypt($key,$iv,$algorithm,$mode,$token) {
	$td = mcrypt_module_open($algorithm, '', $mode, '') ; 
	$iv = substr($iv, 0, mcrypt_enc_get_iv_size($td));

	$expected_key_size = mcrypt_enc_get_key_size($td); 
	$key = substr($key, 0, $expected_key_size); 

	mcrypt_generic_init($td, $key, $iv);

	$response = rtrim(mdecrypt_generic($td, $token), '');

	mcrypt_generic_deinit($td); 
	mcrypt_module_close($td); 

	return $response;
}

$plaintext = decrypt($key,$ivec,$algorithm,$mode,$token);