TEA 加密的 Java 实现

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class TeaUtils {
    private static final int DELTA = 0x9E3779B9;
    private static final int ROUND = 32;
    private static final String KEY = "password";

    /**
     * 加密字符串,使用 TEA 加密算法
     */
    public static String encrypt(String source) {
        ByteBuffer sourceBuffer = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
        sourceBuffer.put(source.getBytes());
        sourceBuffer.clear();
        // 8字节明文
        int[] plaintext = {sourceBuffer.getInt(), sourceBuffer.getInt()};
        ByteBuffer keyBuffer = ByteBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN);
        keyBuffer.put(KEY.getBytes());
        keyBuffer.clear();
        // 16字节密钥
        int[] key = {keyBuffer.getInt(), keyBuffer.getInt(), keyBuffer.getInt(), keyBuffer.getInt()};

        int y = plaintext[0];
        int z = plaintext[1];
        int a = key[0];
        int b = key[1];
        int c = key[2];
        int d = key[3];

        int sum = 0;
        for (int i = 0; i < ROUND; i++) {
            sum += DELTA;
            // 此处必须用 >>> 不能照搬 C++ 用 >>
            // 参考 https://blog.51cto.com/u_16213450/9390405
            y += ((z << 4) + a) ^ (z + sum) ^ ((z >>> 5) + b);
            z += ((y << 4) + c) ^ (y + sum) ^ ((y >>> 5) + d);
        }

        ByteBuffer buffer = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
        buffer.putInt(y);
        buffer.putInt(z);
        buffer.clear();
        StringBuilder builder = new StringBuilder();
        while (buffer.hasRemaining()) {
            builder.append(String.format("%#04x", buffer.get()).replace("0x", ""));
        }
        return builder.toString().toUpperCase();
    }

    /**
     * 解密字符串,使用 TEA 加密算法
     */
    public static String decrypt(String source) {
        int length = source.length();
        byte[] data = new byte[length / 2];
        for (int i = 0; i < length; i += 2) {
            data[i / 2] = (byte) ((Character.digit(source.charAt(i), 16) << 4)
                    + Character.digit(source.charAt(i + 1), 16));
        }
        ByteBuffer sourceBuffer = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
        sourceBuffer.put(data);
        sourceBuffer.clear();
        // 8字节明文
        int[] plaintext = {sourceBuffer.getInt(), sourceBuffer.getInt()};
        ByteBuffer keyBuffer = ByteBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN);
        keyBuffer.put(KEY.getBytes());
        keyBuffer.clear();
        // 16字节密钥
        int[] key = {keyBuffer.getInt(), keyBuffer.getInt(), keyBuffer.getInt(), keyBuffer.getInt()};

        int y = plaintext[0];
        int z = plaintext[1];
        int a = key[0];
        int b = key[1];
        int c = key[2];
        int d = key[3];

        // sum = DELTA * ROUND
        int sum = 0xC6EF3720;
        for (int i = 0; i < ROUND; i++) {
            // 此处必须用 >>> 不能照搬 C++ 用 >>
            // 参考 https://blog.51cto.com/u_16213450/9390405
            z -= ((y << 4) + c) ^ (y + sum) ^ ((y >>> 5) + d);
            y -= ((z << 4) + a) ^ (z + sum) ^ ((z >>> 5) + b);
            sum -= DELTA;
        }

        ByteBuffer buffer = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
        buffer.putInt(y);
        buffer.putInt(z);
        buffer.clear();
        return new String(buffer.array());
    }
}

算法参考 java tea加密
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值