簡體   English   中英

使用Base64編碼的AES-128加密在帶有較長字符串的Java和PHP中的作用不同

[英]AES-128 Encryption with Base64 Encoding doesn't act the same in Java and PHP with longer strings

我一直在嘗試使加密/解密在Java(Android)和PHP中工作相同,並為客戶端/服務器通信產生相同的結果。

我正在使用下面的代碼進行加密,但是我不知道這是怎么回事。 使用相同的密鑰和較小的字符串運行會產生相同的加密值,但是使用較長的字符串,則會得到兩個不同的結果。 PHP:

$str = 'test1234test1234';

$key = 'TESTKEYTESTKEY12';

$block = mcrypt_get_block_size('des', 'ecb');

$pad = $block - (strlen($str) % $block);
$str .= str_repeat(chr($pad), $pad);
echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB));

並在Java中(在Android上):

public static String encryptTest() {
  String cleartext = "test1234test1234";
  String key = "TESTKEYTESTKEY12";
    byte[] raw = key.getBytes();
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    try {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted;
        encrypted = cipher.doFinal(cleartext.getBytes());
    return new String(Base64.encode(encrypted,Base64.DEFAULT));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

在兩個實現中,使用String test1234運行test1234得到: 8i4KEe82TQl0Zdlc14fwAg== 使用字符串test1234test1234但是使用PHP獲得4s5a0edsvwWt/3/enRe0wgJQD/0zL45NRb/r3p6L/Is= ,使用Java獲得4s5a0edsvwWt/3/enRe0wgA0jk78zwWJr1xsosZbYUA= 我不確定哪里出了問題,而且我對密碼學的知識還不夠。

Java代碼的主要問題是您未指定密碼模式和使用的填充算法。 因此,使用哪種加密方式和填充算法取決於所使用的加密提供程序,並且在此特定細節中,Android的工作方式不同於J2SE。

如果我在J2SE上執行Java代碼,則得到的結果與PHP相同。 如果我更改代碼以使用Cipher.getInstance("AES/ECB/PKCS5Padding");這不會改變Cipher.getInstance("AES/ECB/PKCS5Padding");

由於只有密文的最后一塊更改,因此我假設Android默認情況下使用其他填充算法。

您對長字符串和短字符串有不同的結果,這表明您在每個實現上使用不同的填充

確保在Java和php實現上使用相同類型的填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM