2016-03-24 84 views
3

Herkes!AS3 RSAKey.sign()! = PHP openssl_sign()

Bazı metni imzalamak için bazı PHP kodum var ve iyi çalışıyor. Bu kodun actionscript 3'e eşdeğer olması gerekir. Yardımınıza ihtiyacım var. Ben işareti yapmak as3crypto kitaplığını kullanarak AS3 olarak

$privateKeyPath = "private.key"; 
$message = "hello"; 
$privateKey = file_get_contents($privateKeyPath); 
openssl_sign($message, $signature, $privateKey); 

echo base64_encode($signature); 

:

private function readPrivateKey():String { 
    var f:File = new File("/Users/ivan/Desktop/private.key"); 
    var fs:FileStream = new FileStream(); 
    fs.open(f,FileMode.READ); 
    var key:String = fs.readUTFBytes(fs.bytesAvailable); 
    fs.close(); 
    return key; 
} 

private function getSign():void { 
    var message:String = "hello"; 
    var privateKey:String = readPrivateKey(); 
    var srcBA:ByteArray = new ByteArray(); 
    var resultBA:ByteArray = new ByteArray(); 
    var rsaKey:RSAKey; 
    var base64encoder:Base64Encoder = new Base64Encoder(); 

    srcBA.writeUTFBytes(message); 

    rsaKey = PEM.readRSAPrivateKey(privateKey); 
    rsaKey.sign(srcBA, resultBA, srcBA.length); 
    b64encoder.encodeBytes(resultBA); 

    trace(b64encoder.toString()); 
} 

aynı özel anahtar dosyası var. Çıkış değerlerinin eşit olduğunu tahmin ediyorum. Ama bu değerler yanlış yapıyorum (= farklıdır

GÜNCELLEME: Ben genel anahtarı kullanarak kodlanmış base64 dize doğrulamak ve yöntemi doğrulamak için çalıştı - her şey Actionscript içindeki ok Örnek:?.

var text:String = "hello"; 
var srcBA:ByteArray; 
var desBA:ByteArray; 

var rsaKey:RSAKey; 
var encodedB64:String; 

// ENCODING 

srcBA = new ByteArray(); 
srcBA.writeUTFBytes(text); 

desBA = new ByteArray(); 

rsaKey = PEM.readRSAPrivateKey(readPrivateKey()); 
rsaKey.sign(srcBA, desBA, srcBA.length); 

encodedB64 = Base64.encodeByteArray(desBA); 
trace("Original: " + text); 
trace("Encoded: " + encodedB64); 


// DECODING 

var srcBA2:ByteArray = new ByteArray(); 
var desBA2:ByteArray = new ByteArray(); 
var rsaKey2:RSAKey = PEM.readRSAPublicKey(readPublicKey()); 

srcBA2 = Base64.decodeToByteArray(encodedB64); 

rsaKey2.verify(srcBA2, desBA2, srcBA2.length); 

trace("Decoded: " + desBA2.toString()); 

orijinal metin ve deşifre değer eşittir. Yani, AS3 imzalama yöntemleri PHP farklıdır olduğu sonucuna vardır Benim. kimsenin ona eşittir yapmak fikrin var mı?

teşekkürler.

+0

Merhaba Sergeev Ivan, beni konu tarif edeyim farklı –

+1

JK Patel, yorumunuz için teşekkür ederiz. Tamam, anladım ama görevim hala geçerli. Openssl_sign() 'ın klonuna ihtiyacım var. Evet, bu benim çalışmamda –

cevap

0

Belki geç yanıt, ama yine de ... AS3 ikinci kodda çalışıyor, PHP bu gibi bazı tweaks ihtiyacı: http://www.selfsignedcertificate.com/ ve:

$privateKeyPath = "private.key"; 
$message = "hello"; 
$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyPath)); 
openssl_private_encrypt($message, $signature, $privateKey); 

echo base64_encode($signature); 

Sadece bu sitede genereted anahtarla kontrol Her şey iyi çalışıyor, hem PHP hem de AS3 sürümlerinde benzer sonuçlar alıyorum. Eğer imza oluşturmak için rsaKey.sign kullanırken OPENSSL_ALGO_SHA1 böylece hem imza, openssl_sign() verilerinden sindirmek oluşturur ve yaklaşık tür Ve varsayılan şifreleme işlevini sindirmek bilgileri şifreler edilir: