[英]How to XOR a String using a byte array as key?
我正在嘗試使用XOR加密對String進行編碼,並使用byte array
作為鍵:
String encodedString = myString XOR myKey
我沒有太多的密碼學經驗,所以我還沒有找到實現這一目標的方法。
作為對此問題的更新,我發現myKey
也是一個String,並且與myString
長度相同
String encodedString = myString XOR myKey
這是不正確的。 Java中的字符串可以具有任何編碼。 字符串的編碼是使用字節 (即字節數組)的特定字符編碼的表示。
所以你會做:
byte[] encodedString = myString.getBytes(StandardCharsets.UTF_8);
檢索字節。
然后,您可以使用索引遍歷encodedString
的字節。 您將獲得該字節在二進制密鑰中的相同位置,並將這兩個字節異或。 可以將結果放入大小與encodedString
相同的新數組中。 請注意,Java有點奇怪,因為您可能需要強制轉換為字節值,即result[i] = (byte) xorResult
通常,如果密鑰中的字節用完,則必須再次將密鑰中的索引重置為零。 如果發生這種情況,您的加密方案將很容易受到攻擊,因為一次性密碼(OTP)是安全的,但XOR密碼肯定不是。
解密后(與加密相同),您可以使用以下方法取回字符串:
String myString = new String(encodedString, StandardCharsets.UTF_8);
顯然,如果密鑰是字符串,則必須對密鑰進行相同的操作。 然而需要注意的是,即使鍵以及分布在打印的字符,該位值可能不是均勻分布。 換句話說,字符串作為XOR密鑰使您容易受到密碼分析,尤其是對位和字節的頻率分析的影響。
XOR將導致隨機字節,因此您可能需要基於64位編碼(在加密之后)/解碼(在解密之前)以獲得密文字符串而不是字節數組。
我故意省略了執行此操作的代碼,因為這是一項練習任務,請樂於執行!
終於明白了!
希望這對其他人有用。
這對我有用(2個字符串內的XOR):
public static String xorHex(String a, String b) {
// TODO: Validation
char[] chars = new char[a.length()];
for (int i = 0; i < chars.length; i++) {
chars[i] = toHex(fromHex(a.charAt(i)) ^ fromHex(b.charAt(i)));
}
return new String(chars);
}
private static int fromHex(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
}
if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
}
throw new IllegalArgumentException();
}
private static char toHex(int nybble) {
if (nybble < 0 || nybble > 15) {
throw new IllegalArgumentException();
}
return "0123456789ABCDEF".charAt(nybble);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.