BruceWind / AESJniEncrypt

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

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

Closed ZQ7 closed 4 years ago

ZQ7 commented 4 years ago

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

BruceWind commented 4 years ago

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

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

ZQ7 commented 4 years ago

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

BruceWind commented 4 years ago

Thanks for your issue!

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

BruceWind commented 4 years ago

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

ZQ7 commented 4 years ago

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

BruceWind commented 4 years ago

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

BruceWind commented 4 years ago

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

ZQ7 commented 4 years ago

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就有问题了

BruceWind commented 4 years ago

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

ZQ7 commented 4 years ago

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 这是什么原因呀

BruceWind commented 4 years ago

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

BruceWind commented 4 years ago

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

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

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


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

BruceWind commented 4 years ago

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

BruceWind commented 4 years ago

明显你这里

jni_log: -5476577976745dd59e2ed89
jni_log: -5476577976745dd59e2ed89

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

BruceWind commented 4 years ago

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

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

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

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

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

ZQ7 commented 4 years ago

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

BruceWind commented 4 years ago

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

ZQ7 commented 4 years ago

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

BruceWind commented 4 years ago

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

ZQ7 commented 4 years ago

感谢~