Closed ZQ7 closed 4 years ago
我的代码吗?没有做任何修改? 我没有试着把这个key 打印出来过啊。。。我这个getKey()函数很简单啊,我也没有加结尾字符。
你是转成string 打印的吗?确认一下字符串的结尾字符。
@BruceWind 感谢回复哈~getKey()中替换了数据,同时也改变了字符串的长度,然后 uint8_t AES_KEY = (uint8_t ) getKey(); LOGI("%s", AES_KEY);在项目中打印出的log大多数情况都是正常的,偶尔后面会多出一个�或者是� +一个字母,很奇怪,如果有问题不应该都有问题么,这个只会偶尔发生
Thanks for your issue!
1.关于改变字符串的长度 ,AES算法对key的length有特殊要求,不要随意修改length。 2.这个字符的事情,我怀疑是不是base64出现问题,你试着把长度 还有最后一个字符的int值打出来检查一下吧。感觉只能帮你到这里了。
或者 你不用base64 直接 用key的原文 打印看看。
应该是base64的问题,在AES算法之前key就已经有问题了
base64有问题,那你的加密解密会出现错误。因为你得到的key已经发生变化。
最好定位下问题先,现在不好说问题原因。
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就有问题了
你试着把长度,还有每个字符的int值打出来检查一下吧。
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 这是什么原因呀
等等,好像有点乱.... 我仔细看了下你的代码,你弄错了.
char *encode_str = s + 1; 这句意思是忽略密文char数组的第一位。 你看下我之前的逻辑:
char s[23];//"NMTIzNDU2Nzg5MGFiY2RlZg";
忽略第一位是:MTIzNDU2Nzg5MGFiY2RlZg,你拿这个值decodebase64 得到1234567890abcdef;
明白我的意思了吗?? 我getKey() 函数返回的是1234567890abcdef,而我写进代码里的时候,根本看不到1234567890abcdef这个字符串的。
你如果模仿我的代码去改,需要拿你的key去base64得到密文,密文之前追加一个任意字符,然后填到这个getKey里的数组。
明显你这里
jni_log: -5476577976745dd59e2ed89
jni_log: -5476577976745dd59e2ed89
这是奇怪的东西,怎么可能你得到的key是这样子。
char *encode_str = s + 1; 这句意思是忽略密文char数组的第一位。 你看下我之前的逻辑:
char s[23];//"NMTIzNDU2Nzg5MGFiY2RlZg";
忽略第一位是:MTIzNDU2Nzg5MGFiY2RlZg,你拿这个值decodebase64 得到1234567890abcdef;
明白我的意思了吗?? 我getKey() 函数返回的是1234567890abcdef,而我写进代码里的时候,根本看不到1234567890abcdef这个字符串的。
AES128算法要求key的长度是16.
满足现有需求后面的代码我有改动,没有用到AES128算法。-5476577976745dd59e2ed89这个确实是我的Key,Base64之后是LTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5,我在密文第一位加了H,然而在Key密文获取的时候就会出现问题,后面总会多几个字符
好吧,那我看上去你还没有执行base64就打印出乱码了,这个跟base64算法无关了。那么这个实在查不到原因了。如果不影响你其他运算这个可以忽略。感觉会定位到ndk的代码了跟我没关系了感觉。
char s[] = "HLTU0NzY1Nzc5NzY3NDVkZDU5ZTJlZDg5"; 这样初始化数组没有问题,s[n++]这样不行
好吧,那你可以试着自己改下用其他方案,不用用s[n++]
.
感谢~
打包成aar应用在项目中,打印Log发现偶尔会在获取到的key后边拼接一个�乱码,是什么问题导致的呢。。