簡體   English   中英

如何使用字節數組作為鍵對字符串進行XOR?

[英]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.

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