2012-03-21 37 views
1

我有一個AES加密的問題,客戶向我展示了他們的「解密」PHP服務器代碼。奇怪的是,確切的代碼來自S.O. (不奇怪)。我發現這一點,因爲客戶通過我的代碼有完全相同的評論! :)我該如何將此PHP行移植到Java?

無論如何,這是從this S.O.取得的一段PHP代碼。題。

我試圖做與Java相同的,但我不知道這是什麼確切的行補充說:

$key = 'a16byteslongkey!'; 

$padded_key = $key . str_repeat(chr(0x00), 16); // Argh! 

(!注意//哎呀評論是不是我的)

它是否試圖添加chr(0x00)來創建一個32字節的密鑰(因爲$ key是16?)如果是的話,我如何在Java中執行相同的操作?

+0

@喬希也許我應該澄清:在PHP中做什麼是chr(0x00)? – 2012-03-21 17:32:55

+0

在PHP中,字符串是二進制安全的(字符串中的每個「字符」實際上只是一個字節),但Java的String實例不是(它們實際上表示字符,而不是字節)。對於二進制加密密鑰,你可能不應該使用'String'對象,而應該使用'byte []'或類似'Key'類的東西。 – 2012-03-21 17:54:51

+0

@AnotherCode的確,謝謝你的澄清。事實證明,客戶在服務器端做了一件「黑客行爲」的事情,用16個零填充了16個字節的密鑰,所以它增加了32個......在用16個「零」填充固定密鑰後,這一切都奏效了。 ;) – 2012-03-21 18:00:05

回答

2

正如加雷思說這個返回與ASCII碼爲0的字符使用此,我們可以讓這些重複的字符串的函數:

public static String strRepeat(String toRepeat, int reps){ 
    //Sanity checks go here! 
    StringBuilder sb = new StringBuilder(); 
    for(int x = 0; x < reps; x++){ 
     sb.append(toRepeat); 
    } 
    return sb.toString(); 
} 

現在線可被替換:

String paddedKey = key + strRepeat('\0', 16); // Argh! 
+0

尊重評論;) – 2012-03-21 17:47:25

1

chr(0x00)應該返回ASCII碼0的字符,我認爲這可以用Java中的來表示。

+0

感謝加雷思,這有幫助。 – 2012-03-21 17:51:08