当前位置: 首页 > news >正文

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/9390405y += ((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 * ROUNDint sum = 0xC6EF3720;for (int i = 0; i < ROUND; i++) {// 此处必须用 >>> 不能照搬 C++ 用 >>// 参考 https://blog.51cto.com/u_16213450/9390405z -= ((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加密
 

http://www.lryc.cn/news/374945.html

相关文章:

  • 鸿蒙开发电话服务:【@ohos.telephony.data (蜂窝数据)】
  • Maven认识与学习
  • “深入探讨Redis主从复制:原理、配置与优化“
  • HTML初体验
  • 全局特征提取netvlad的理解
  • 【设计模式-12】代理模式的代码实现及使用场景
  • 网工内推 | 神州数码、弧聚科技网工,IE认证优先,最高18K
  • 【Linux】模拟实现一个简单的日志系统
  • MongoDB 多层级查询
  • grpc代理服务的实现(一)
  • FastAPI系列 4 -路由管理APIRouter
  • 数据驱动制造:EMQX ECP 指标监测功能增强生产透明度
  • 一行代码实现鼠标横向滚动
  • Flink集群架构
  • 计算机网络(6) UDP协议
  • 单片机(STM32)与上位机传输浮点数
  • 50etf期权交易规则杠杆怎么计算?
  • 鸿蒙: 基础认证
  • 2024年最佳插电式混合动力电动汽车
  • 上海交通大学、中科大 开源镜像站停止 Docker Hub 仓库镜像支持后的可用替代源
  • 【Linux】shell——条件判断test,各种运算符,expr
  • 中介子方程二十二
  • 你还不会选ProfiNET和EtherCAT网线?
  • 醉美酒话:承载着深厚文化底蕴的敬酒词
  • vue3-sfc-loader动态加载一个异步vue组件生成cesium画面
  • flink学习-状态管理
  • OpenCV图像算术位运算
  • 【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】
  • ssm宠物网站系统-计算机毕业设计源码07183
  • 想上币的项目方怎么去选择交易所