首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 數字加密傳輸實戰:逆序+偏移+首尾交換算法完整實現

     編輯:Java 相關知識

業務場景與加密規則

某系統需對 8 位以內整數進行簡易加密傳輸,規則如下:

  1. 逆序:123456 → 654321
  2. 每位 +5 取模 10:6→1, 5→0, 4→9, 3→8, 2→7, 1→6 → 109876
  3. 首尾交換:109876 → 609871

核心算法實現

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) % 10Java % 對負數結果為負,但此處 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,所以加解密邏輯完全一致,極其優雅。

安全性評估與適用邊界

  • 僅為簡易混淆:屬於對稱替換密碼,無密鑰,極易被逆向破解。
  • 適用場景:非敏感業務字段(如訂單號顯示混淆、內部傳輸簡易校驗)。
  • 禁用場景:密碼、Token、金額、身份證等敏感數據 —— 必須使用 AES/RSA 等工業級加密。

總結

本文實現了「逆序 → 位偏移 → 首尾交換」的完整加解密閉環,代碼簡潔、邊界處理完善、加解密邏輯自逆。理解其數學本質(模 10 群上的自逆映射)有助於舉一反三設計類似輕量混淆方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved