PHP: ARMUT: Perl CBC ile deşifre, Crypt_CBC ile Şifreleme

3 Cevap php

Yapmam gereken görevlerden biri bana PHP'nin yanından şey şifrelemek ve sonra Perl ile şifresini gerekiyor.

Benim ihtiyaçları için uygun olduğu ortaya çıktı ben buldum PEAR modülü Crypt_CBC oldu. Ancak, bugüne kadar doğru sonuçlar elde elde etmek yapamaz oldum gibi, orada yapıyorum yanlış bir şey olmalı ya da anlamıyorum.

Benim gerçek projenin kod uygulamadan önce tüm denemek istedim aşağıda kod alıntılar, özellikle test amaçlıdır.

Öncelikle, burada benim PHP kodu ben bir $ metin parametresi (yani cryptTest.php? Text = merhaba) geçirilir olursa olsun şifrelemek hangi ile, bu

require_once('Crypt/CBC.php');  

$key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";  
$cipher = new Crypt_CBC($key, 'BLOWFISH');

$encrypted = $cipher->encrypt($text);  

if (PEAR::isError($encrypted)) {  
    echo $encrypted->getMessage();  
} else {  
    echo "ENCRYPTED STRING: " . $encrypted;  
}

Bu noktadan itibaren, (benim tarayıcınızın çıktıda) Bu komut yankılandı ne olursa olsun kopya ve aşağıda benim PERL script $ şifreli değişkene yapıştırın:

use Crypt::CBC; 
$encrypted = "RandomIVá´bp3Ó¯làK”Á(Û";  
my $key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";  
my $vector = "\0\0\0\0\0\0\0\0";  

my $cipher = Crypt::CBC->new(  
                       {'key'             =>$key,  
                        'cipher'          => 'Blowfish',  
                        'iv'              => $vector,  
                        'prepend_iv'      => 0  
                       });  

my $plaintext = $cipher->decrypt($encrypted);

print $plaintext;

Perl tarafında ve böyle IV belirterek değil gibi, çok şeyler çalışıyorum, ama bana hata veriyor tuttu. Bu form ben hiç bir çıktı alıyorum hangi ile sadece bir tanesidir.

Orijinal $ metin ile yukarıdaki yürütülmesi için sonuç = "merhaba":? Pñšîî7 àÐŽZÊ & Rhello

Ne bulmak benim orijinal içeriği doğru şekilde deşifre olmasıdır, ama ben istiyorum bölümünden önce bok-karakter bir sürü eklemeden.

Herkes yanlış ne yapıyorum bana işaret edebilir ve nasıl çözebilirsiniz?

Bir demet teşekkür.

3 Cevap

CBC hataya dayanıklı değildir; şifre metin ile bir sorun tüm blok yok. Yani, bazı ekstra çöp ile düz metin kurtarmak mümkün olduğu gerçeği sorun dolgu değil, şifreleme kendisi ile olduğunu göstermektedir.

Bir blok şifre tam bloklar üzerinde çalışır. Son blok eksik ise, alıcı dolgu ne olduğunu belirlemek için izin verir ve veri nedir bir şekilde doldurulur. Dolgu tedavi edilir öğrenmek için API belgelerine arayın.

Mümkünse, basılamaz bayt görünür böylece onu onaltılık ve sonrası deşifre şifresiz dönüştürülür. Bu PHP tarafında kullanılan dolgu şeması ortaya çıkarabilir.

Sonunda benim soruna çözüm bulundu.

Eğer çocuklar hem teşekkürler, gerçi cevaplar yardım yaptı. Ben base64 / decode kodlamak ve bu nedenle herhangi bir düz metin kodlama sorunları önlemek için tavsiye takip yaptı.

Ben şifre çözme işi yapmak için ne yapması gerektiğini şifrelenirken PEAR'ın Crypt_CBC sınıf Rastgele IV kullandığından beri, 'header' => 'randomiv' benim Perl, senaryonun şifre yaratma ekleyin.

I-Crypt::CBC's documentation o belirli parametre bulundu.

Ayrıca, CBC.php doğrudan bakarak 'nin şifresini işlevi, ben IV belirlemek için ne yaptığını bulunan: başlığının al (' RandomIV ') uzunluk ve olarak kullanmak bir {[kadar şifreli dize substr offset ( Varsayılan 0)]} 's değeri (8). Ben de iyi ölçmek için keysize (56 varsayılan) belirtilmiş.

Tamlık 'aşkına ve başvuru için, burada benim güncellenen test komut ikisi şunlardır:

PHP (cryptTest.php):

require_once('Crypt/CBC.php');

$key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";  
$cipher = new Crypt_CBC($key, 'BLOWFISH');

$encrypted = $cipher->encrypt($text);

if (PEAR::isError($encrypted)) {  
    echo $encrypted->getMessage();  
} else {  
    echo "ENCRYPTED STRING: " . base64_encode($encrypted);  
}

PERL (decryptTest.pl)

use Crypt::CBC;  
use MIME::Base64;

my $encrypted = decode_base64("UmFuZG9tSVbrNE3ony00FlUbiprLn0fu");  
my $key = "8326554161EB30EFBC6BF34CC3C832E7CF8135C1999603D4022C031FAEE";  
my $header_spec = "randomiv";  
my $blocksize = 8;  
my $keysize = 56;  

my $iv_offset = length $header_spec;  
my $iv = substr $encrypted, $iv_offset, $blocksize;

my $cipher = Crypt::CBC->new(  
                {'key'        =>$key,  
                'cipher'    	=> 'Blowfish',  
                'iv'    	    => $iv,  
                'header'    	=> $header_spec,  
                'prepend_iv'    => $iv_offset,  
                'blocksize'  => $blocksize,  
                'keysize'      => $keysize   
                })  

my $plaintext = $cipher->decrypt($encrypted);

print $plaintext;

Buyurun. Yine, çok teşekkürler!

Mathieu

Eğer şifreleme rutin düz çıkışı ile bu yapmamalıyız. Bu kodlama sorunları her türlü içine çalıştırmak olasıdır. Ben şifre çözme önce şifreli dize base64 kodlamak ve bu kopyalayıp yapıştırın ve ardından base64 decode öneririz.