没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
c++代码实现代码实现tea加密算法的实例详解加密算法的实例详解
主要介绍了c++代码实现tea加密算法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一
定的参考借鉴价值,需要的朋友可以参考下
通过c++来实现tea加密算法,最终编译成so文件,以JNI的方式提供给客户端调用,主要需要解决以下三个问题:
实现tea算法,这都有开源的代码可以实现;
解决padding问题;
密钥做一个混淆,防止编译生成的库文件方便的被逆向拿到;
对于tea的加密算法,有成熟的各语言代码可以借鉴,下面是C++的实现:
static void tea_encrypt(uint32_t *v, uint32_t *k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0, i;
uint32_t delta = 0x9e3779b9;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < tea_round; i++) {
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
}
v[0] = v0;
v[1] = v1;
}
static void tea_decrypt(uint32_t *v, uint32_t *k) {
uint32_t v0 = v[0], v1 = v[1], sum, i;
sum = (tea_round == 16) ? 0xE3779B90 : 0xC6EF3720;
uint32_t delta = 0x9e3779b9;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < tea_round; i++) {
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v[0] = v0;
v[1] = v1;
}
生成密钥,并对密钥做一定的混淆
static uint32_t tea_key[4] = {
0x34561234, 0x111f3423, 0x34d57910, 0x00989034
};
static uint32_t salt = 0x12031243;
static int tea_round = 16;
//做简单的混淆
static void confuse_key(uint32_t *key) {
for (int i = 4; i > 0; i--) {
key[4 - i] = tea_key[i - 1] ^ salt;
}
}
最后要实现加密算法的padding,首先思考一个问题,为什么要padding呢?
因为Tea是块加密算法,8个字节为一个块。而在现实的场景中,不会所有的要加密的数据都8的倍数。比如我要加密15,35
等字节该怎么办?那么这里需要涉及到两个操作:
加密的时在不足8个字节的部分进行填充,直至待加密数据为8的倍数;
加密时将填充的部分去掉;
那么,填充的数据是必须要有一定规则的,解密的人才知道这部分数据是填充的,而非真实的原始数据。填充部分必须有包含
有表示填充长度的字段。目前比较常用的是PKCS#7填充法;即:
末尾填充的每个字节均为填充长度
比如填充一个字节就是: 0x01
填充5个字节就是: 0x05,0x05,0x05,0x05,0x05;
资源评论
weixin_38674763
- 粉丝: 6
- 资源: 967
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功