TEA 加密的 Java 实现

作者 : admin 本文共2198个字,预计阅读时间需要6分钟 发布时间: 2024-06-16 共1人阅读
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 >> 不能照搬 C++ 用 >>
            // 参考 https://blog.51cto.com/u_16213450/9390405
            y += ((z <>> 5) + b);
            z += ((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 >> 不能照搬 C++ 用 >>
            // 参考 https://blog.51cto.com/u_16213450/9390405
            z -= ((y <>> 5) + d);
            y -= ((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加密
 

本站无任何商业行为
个人在线分享 » TEA 加密的 Java 实现
E-->