在密碼學中,**一次一密(One-Time Pad, OTP)** 是唯一被證明具有**絕對理論安全性**的加密方案。只要滿足三大條件,即便擁有無限算力的攻擊者也無法破解。本文解析原理、條件、Java 實現與實際應用限制。
給定任意密文 C,對於**任意**可能的明文 P,總存在唯一密鑰 K = P ⊕ C 使其成立。攻擊者看到密文,無法獲得任何關於明文的統計資訊(完美保密性,香農 1949 證明)。
public class OneTimePadUtil {
/** 逐位異或加密/解密(對稱操作) */
public static byte[] xor(byte[] plainBytes, byte[] keyBytes) {
if (keyBytes.length != plainBytes.length) {
throw new IllegalArgumentException("密鑰長度必須等於明文長度");
}
byte[] result = new byte[plainBytes.length];
for (int i = 0; i < result.length; i++) {
result[i] = (byte) (plainBytes[i] ^ keyBytes[i]);
}
return result;
}
}
String plainText = "溫少";
String keyText = "密碼"; // 必須等長,實際應用由真隨機源生成
byte[] plainBytes = plainText.getBytes("UTF-8");
byte[] keyBytes = keyText.getBytes("UTF-8");
// 編譯期斷言長度相等
assert plainBytes.length == keyBytes.length;
// 加密
byte[] cipherBytes = OneTimePadUtil.xor(plainBytes, keyBytes);
// 解密(同樣異或)
byte[] decryptedBytes = OneTimePadUtil.xor(cipherBytes, keyBytes);
String decryptedText = new String(decryptedBytes, "UTF-8"); // "溫少"
| 痛點 | 說明 |
|---|---|
| 密鑰分發 | 雙方必須**安全預共享**等長密鑰,若有安全信道傳密鑰,為何不直接傳明文? |
| 密鑰管理 | 海量等長真隨機密鑰的生成、儲存、同步、銷毀極其昂貴。 |
| 長度限制 | 長訊息需極長密鑰,頻寬與儲存成本成倍增長。 |
「OTP 是密碼學的聖杯:理論完美、工程近乎不可能。理解它,是為了知曉安全的邊界在哪裡。」