某系統需對 8 位以內整數進行簡易加密傳輸,規則如下:
public class NumberEncryptor {
/**
* 加密入口
* @param number 明文數字(正整數,< 10^8)
* @return 密文字符串(保留前導零特性)
*/
public static String encrypt(int number) {
if (number < 0) throw new IllegalArgumentException("僅支持非負整數");
// 1. 逆序拆解到數組(個位在索引 0)
int[] digits = new int[8];
int len = 0;
while (number > 0) {
digits[len++] = number % 10;
number /= 10;
}
// 處理 number=0 邊界
if (len == 0) digits[len++] = 0;
// 2. 每位 +5 模 10
for (int i = 0; i < len; i++) {
digits[i] = (digits[i] + 5) % 10;
}
// 3. 首尾交換
if (len > 1) {
int tmp = digits[0];
digits[0] = digits[len - 1];
digits[len - 1] = tmp;
}
// 4. 拼接結果(高位在前)
StringBuilder sb = new StringBuilder(len);
for (int i = len - 1; i >= 0; i--) {
sb.append(digits[i]);
}
return sb.toString();
}
// 測試主方法
public static void main(String[] args) {
System.out.println(encrypt(123456)); // 輸出: 609871
System.out.println(encrypt(0)); // 輸出: 5
System.out.println(encrypt(9)); // 輸出: 4
System.out.println(encrypt(10000000)); // 8位數測試
}
}
| 步驟 | 技術點 | 避坑指南 |
|---|---|---|
| 逆序拆解 | 取模 10 取個位,除 10 右移 | 注意 number=0 時 while 不進入,需補位 |
| +5 模 10 | (digit + 5) % 10 | Java % 對負數結果為負,但此處 digit≥0 安全 |
| 首尾交換 | 索引 0 ↔ 索引 len-1 | 長度 1 時無需交換,避免數組越界 |
| 結果拼接 | StringBuilder 逆序遍歷數組 | 保留高位 0 特性(如輸入 100 → 加密後可能以 0 開頭) |
public static int decrypt(String cipher) {
// 1. 字符串轉數組(高位在前)
int len = cipher.length();
int[] digits = new int[len];
for (int i = 0; i < len; i++) {
digits[i] = cipher.charAt(i) - '0';
}
// 2. 首尾交換(加密是首尾換,解密再換一次即還原)
if (len > 1) {
int tmp = digits[0];
digits[0] = digits[len - 1];
digits[len - 1] = tmp;
}
// 3. 每位 -5 模 10(等價於 +5 模 10,因為 10-5=5)
for (int i = 0; i < len; i++) {
digits[i] = (digits[i] + 5) % 10; // 同加密操作,因為模10下 +5 是自逆運算
}
// 4. 逆序組裝數字(數組索引0是個位)
int result = 0;
for (int i = len - 1; i >= 0; i--) {
result = result * 10 + digits[i];
}
return result;
}
數學原理:模 10 下,+5 是自逆運算,即 (x+5+5)%10 == x,所以加解密邏輯完全一致,極其優雅。
本文實現了「逆序 → 位偏移 → 首尾交換」的完整加解密閉環,代碼簡潔、邊界處理完善、加解密邏輯自逆。理解其數學本質(模 10 群上的自逆映射)有助於舉一反三設計類似輕量混淆方案。