2017-06-08 23 views
-3

皆さん、Javaの例のAES256暗号化を使用するAPIをPHPに統合しようとすると、大きな障害になっています。これはドキュメントにあるJavaバージョンです。このことからJavaのAES256暗号化アルゴリズムをPHPに変換する

package com.partner.carrier.library; 

import java.io.UnsupportedEncodingException; 

import org.bouncycastle.crypto.CipherParameters; 
import org.bouncycastle.crypto.DataLengthException; 
import org.bouncycastle.crypto.InvalidCipherTextException; 
import org.bouncycastle.crypto.engines.RijndaelEngine; 
import org.bouncycastle.crypto.modes.CBCBlockCipher; 
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; 
import org.bouncycastle.crypto.paddings.ZeroBytePadding; 
import org.bouncycastle.crypto.params.KeyParameter; 
import org.bouncycastle.crypto.params.ParametersWithIV; 
import org.bouncycastle.util.encoders.Base64; 

import com.partner.config.ConfigData; 

public class AES { 
    private static byte[] _sessionKey = "YOUR-KEY".getBytes(); 
    private static byte[] _initialVector = "INITVECTOREXAMPLE".getBytes(); 
     private static int _keySize = 256; 
     private static int _blockSize = 128;  

    public static String Encrypt(String txt) 
    { 
     PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new RijndaelEngine(_blockSize)), new ZeroBytePadding()); 
     CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(_sessionKey, 0, (_keySize/8)), _initialVector, 0, (_blockSize/8)); 
     cipher.init(true, ivAndKey); 

     try { 
      byte[] decoded = txt.trim().getBytes("UTF-8"); 
      byte[] encoded = new byte[cipher.getOutputSize(decoded.length)]; 
      int len = cipher.processBytes(decoded, 0, decoded.length, encoded, 0); 

      cipher.doFinal(encoded, len); 
      return new String(Base64.encode(encoded)); 
     } 
     catch (DataLengthException | IllegalStateException | InvalidCipherTextException | UnsupportedEncodingException e) { 
      return null; 
     } 
    } 

}

私はこの

openssl_encrypt($data, "aes-256-cbc", “YOURKEY”, null, "INITVECTOREXAMPLE"); 

のようにPHPで何かを実行する必要があることを収集することができますし、私はそれをBase64でにその結果を変換して返す必要がありますか?これは正しいです? ZeroBytePadding()呼び出しとそのすべてが私にとって本当に混乱しています。

ありがとうございました! :)は

+0

* "そして、その結果をBase64に変換して返すべきですか?" * - これはすでにBase64でエンコードされています。そのコード行から何を得るのか見ていないのですか? * "ZeroBytePadding()呼び出しとそのすべてが私にとって本当に混乱しています。" * - なぜですか? 'openssl_encrypt'のドキュメントを読んでいないのですか?オプション 'OPENSSL_ZERO_PADDING'が含まれています。 @ArtjomB。 –

+0

申し訳ありませんが、質問がばかばかしい場合は、私は少し前にこの種のことをやったことがないので、私は圧倒されている理由は、PHPでopensslを見てきたのは初めてです。あなたにとって私には明らかなことはありません。 しかし、私はそれをやったことがあります。その点を踏まえれば、理論的にはJavaの例と同じ出力が得られますか? –

答えて

0

http://aesencryption.net/#PHP-aes-encryption-example

この優れたクラスを使用して問題を解決するだけわずかにそれを微調整し、そこに私は今、それが正常に動作し、行きます。

$encoder = new AES($data, "PRIVATEKEYHERE", 128, "cbc", "INITIALVECTORIFANY"); 
$_SESSION['ENCRYPTED_DATA'] = $encoder->encrypt(); 

これは、後で誰かがラインを追いかけるのを助けます:)ありがとう!

関連する問題