BruceWind / AESJniEncrypt

🛡 Make safest code in Android. (基于libsodium实现chacha20算法,key在native中,防止被二次打包){长期维护,请star,勿fork}

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

获取到的key后边拼接一个�乱码

ZQ7 opened this issue · comments

commented

打包成aar应用在项目中,打印Log发现偶尔会在获取到的key后边拼接一个�乱码,是什么问题导致的呢。。

commented

我的代码吗?没有做任何修改?
我没有试着把这个key 打印出来过啊。。。我这个getKey()函数很简单啊,我也没有加结尾字符。

你是转成string 打印的吗?确认一下字符串的结尾字符。

commented

@BruceWind 感谢回复哈~getKey()中替换了数据,同时也改变了字符串的长度,然后 uint8_t *AES_KEY = (uint8_t *) getKey(); LOGI("%s", AES_KEY);在项目中打印出的log大多数情况都是正常的,偶尔后面会多出一个�或者是� +一个字母,很奇怪,如果有问题不应该都有问题么,这个只会偶尔发生

commented

Thanks for your issue!

1.关于改变字符串的长度 ,AES算法对key的length有特殊要求,不要随意修改length。
2.这个字符的事情,我怀疑是不是base64出现问题,你试着把长度 还有最后一个字符的int值打出来检查一下吧。感觉只能帮你到这里了。

commented

或者 你不用base64 直接 用key的原文 打印看看。

commented

应该是base64的问题,在AES算法之前key就已经有问题了

commented

base64有问题,那你的加密解密会出现错误。因为你得到的key已经发生变化。

commented

最好定位下问题先,现在不好说问题原因。

commented

char *getKey() {
int n = 0;
char s[33];//"NMTIzNDU2Nzg5MGFiY2RlZg";

s[n++] = 'H';
s[n++] = 'L';
s[n++] = 'T';
s[n++] = 'U';
s[n++] = '0';
s[n++] = 'N';
s[n++] = 'z';
s[n++] = 'Y';
s[n++] = '1';
s[n++] = 'N';
s[n++] = 'z';
s[n++] = 'c';
s[n++] = '5';
s[n++] = 'N';
s[n++] = 'z';
s[n++] = 'Y';
s[n++] = '3';
s[n++] = 'N';
s[n++] = 'D';
s[n++] = 'V';
s[n++] = 'k';
s[n++] = 'Z';
s[n++] = 'D';
s[n++] = 'U';
s[n++] = '5';
s[n++] = 'Z';
s[n++] = 'T';
s[n++] = 'J';
s[n++] = 'l';
s[n++] = 'Z';
s[n++] = 'D';
s[n++] = 'g';
s[n++] = '5';
char *encode_str = s + 1;
char *decode_str = b64_decode(encode_str, strlen(encode_str));
LOGI("%s", encode_str);
LOGI("%s", decode_str);
return decode_str;

}

jni_log: LTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5�}U~
jni_log: LTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5��~|`��
jni_log: -5476577976745dd59e2ed89
jni_log: -5476577976745dd59e2ed89

取到的Key就有问题了

commented

你试着把长度,还有每个字符的int值打出来检查一下吧。

commented

char *getKey() {
int n = 0;
char s[33];//"NMTIzNDU2Nzg5MGFiY2RlZg";

s[n++] = 'H';
s[n++] = 'L';
s[n++] = 'T';
s[n++] = 'U';
s[n++] = '0';
s[n++] = 'N';
s[n++] = 'z';
s[n++] = 'Y';
s[n++] = '1';
s[n++] = 'N';
s[n++] = 'z';
s[n++] = 'c';
s[n++] = '5';
s[n++] = 'N';
s[n++] = 'z';
s[n++] = 'Y';
s[n++] = '3';
s[n++] = 'N';
s[n++] = 'D';
s[n++] = 'V';
s[n++] = 'k';
s[n++] = 'Z';
s[n++] = 'D';
s[n++] = 'U';
s[n++] = '5';
s[n++] = 'Z';
s[n++] = 'T';
s[n++] = 'J';
s[n++] = 'l';
s[n++] = 'Z';
s[n++] = 'D';
s[n++] = 'g';
s[n++] = '5';
char *encode_str = s + 1;
int num = strlen(encode_str);
LOGI("字符串长度为:%d",num);
LOGI("%s", encode_str);
char *decode_str = b64_decode(encode_str, strlen(encode_str));
LOGI("%s", decode_str);
return decode_str;

}
这个是调试结果:
jni_log: 字符串长度为:32
jni_log: LTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5
jni_log: -5476577976745dd59e2ed89
打包成aar放到项目中的结果却是这样的:
jni_log: 字符串长度为:36
jni_log: LTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5,�m~
jni_log: -5476577976745dd59e2ed89
这是什么原因呀

commented

等等,好像有点乱....
我仔细看了下你的代码,你弄错了.

commented

char *encode_str = s + 1; 这句意思是忽略密文char数组的第一位。
你看下我之前的逻辑:

char s[23];//"NMTIzNDU2Nzg5MGFiY2RlZg";

忽略第一位是:MTIzNDU2Nzg5MGFiY2RlZg,你拿这个值decodebase64 得到1234567890abcdef;


明白我的意思了吗??
我getKey() 函数返回的是1234567890abcdef,而我写进代码里的时候,根本看不到1234567890abcdef这个字符串的。

commented

你如果模仿我的代码去改,需要拿你的key去base64得到密文,密文之前追加一个任意字符,然后填到这个getKey里的数组。

commented

明显你这里

jni_log: -5476577976745dd59e2ed89
jni_log: -5476577976745dd59e2ed89

这是奇怪的东西,怎么可能你得到的key是这样子。

commented

char *encode_str = s + 1; 这句意思是忽略密文char数组的第一位。
你看下我之前的逻辑:

char s[23];//"NMTIzNDU2Nzg5MGFiY2RlZg";

忽略第一位是:MTIzNDU2Nzg5MGFiY2RlZg,你拿这个值decodebase64 得到1234567890abcdef;

明白我的意思了吗??
我getKey() 函数返回的是1234567890abcdef,而我写进代码里的时候,根本看不到1234567890abcdef这个字符串的。

AES128算法要求key的长度是16.

commented

满足现有需求后面的代码我有改动,没有用到AES128算法。-5476577976745dd59e2ed89这个确实是我的Key,Base64之后是LTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5,我在密文第一位加了H,然而在Key密文获取的时候就会出现问题,后面总会多几个字符

commented

好吧,那我看上去你还没有执行base64就打印出乱码了,这个跟base64算法无关了。那么这个实在查不到原因了。如果不影响你其他运算这个可以忽略。感觉会定位到ndk的代码了跟我没关系了感觉。

commented

char s[] = "HLTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5";
这样初始化数组没有问题,s[n++]这样不行

commented

好吧,那你可以试着自己改下用其他方案,不用用s[n++].

commented

感谢~