Используя RNCryptor на Android
У меня есть несколько файлов изображений, которые зашифрованы с помощью RNCryptor, и я хочу расшифровать их и использовать их в качестве фона Framelayout. Я просматриваю примеры файлов, но моя прикладная программа закрывается через некоторое время и не показывает никаких изображений. Я использую библиотеку JNCryptor
Я положил зашифрованное изображение в сырую папку, как показано ниже:
и это мой код в моей деятельности:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FrameLayout img = (FrameLayout) findViewById(R.id.scrollView);
final String password = "myPasswordString";
JNCryptor cryptor = new AES256JNCryptor();
Resources res = getResources();
InputStream in_s = res.openRawResource(R.raw.troodon_ph);
byte[] b = null;
byte[] data = null;
try {
b = new byte[in_s.available()];
in_s.read(b);
} catch (IOException e) {
Log.i("decrypt error", e.toString());
}
try {
data = cryptor.decryptData(b, password.toCharArray());
} catch (InvalidHMACException e) {
Log.i("decrypt error", e.toString());
} catch (CryptorException e) {
Log.i("decrypt error", e.toString());
}
Bitmap mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
BitmapDrawable bDrawable = new BitmapDrawable(res, mBitmap);
img.setBackgroundDrawable(bDrawable);
}
Этот файл отлично работает на iOS с этим кодом:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:getName ofType:@"wod"];
NSData *encryptedData = [NSData dataWithContentsOfFile:imagePath];
NSData *decryptedData = [RNDecryptor decryptData:encryptedData
withPassword:PASSWORD
error:&error];
UIImage* bgImage = [UIImage imageWithData:decryptedData];
UIImageView * movingImageView = [[UIImageView alloc]initWithImage:bgImage];
И вот вывод logcat:
08-28 19: 52: 11.720: E / AndroidRuntime (1063): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной 08-28 19:52:11.720: E/AndroidRuntime(1063): java.lang.RuntimeException: Невозможно запустить действие ComponentInfo{net.appersian.android.wod/net.appersian.android.wod.MainActivity}: java.lang.NullPointerException 08-28 19:52:11.720: E/AndroidRuntime(1063): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java):2059) 08-28: 19:52:11.720: E/AndroidRuntime(1063): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.app.ActivityThread.access$600(ActivityThread.java:130) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.os.Handler.dispatchMessage(Handler.java:99) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.os.Looper.loop(Looper.java:137) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.app.ActivityThread.main(ActivityThread.java:4745) 08-28 19:52:11.720: E/AndroidRuntime(1063): на java.lang.reflect.Method.invokeNative(собственный метод) 08-28 19: 52: 11.720: E / AndroidRuntime (1063): в java.lang.reflect.Method.invoke(Method.java:511) 08-28 19:52:11.720: E/AndroidRuntime(1063): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 08-28 19:52:11.720: E/AndroidRuntime(1063): на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 08-28 19:52:11.720: E/AndroidRuntime(1063): в dalvik.system.NativeStart.main(собственный метод) 08-28 19: 52: 11.720: E / AndroidRuntime (1063): вызвано: java.lang.NullPointerException 08-28 19: 52: 11.720: E / AndroidRuntime (1063): на net.appersian.android.wod.MainActivity.onCreate(MainActivity.java:54) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.app.Activity.performCreate(Activity.java:5008) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 08-28 19:52:11.720: E/AndroidRuntime(1063): на android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 08-28 19:52:11.720: E/AndroidRuntime(1063): ... еще 11
Что я делаю не так с расшифровкой файла?
обновление: я добавил e.printStackTrace(), чтобы попробовать / поймать, и вот мой новый logcat:
08-28 20: 54: 10.496: W / System.err (1487): org.cryptonode.jncryptor.InvalidHMACException: Неверное значение HMAC. 08-28 20:54:10.496: W/System.err(1487): в org.cryptonode.jncryptor.AES256JNCryptor.decryptV3Data(AES256JNCryptor.java:244) 08-28 20:54:10.496: W/System.err(1487): atg.cryptonode.jncryptor.AES256JNCryptor.decryptV3Data(AES256JNCryptor.java:319) 08-28 20:54:10.496: W/System.err(1487): atg.java:276) 08-28 20:54:10.496: W/System.err(1487): at net.appersian.android.wod.MainActivity.onCreate(MainActivity.java:50) 08-28 20:54:10.496: W/System.err(1487): на android.app.Activity.performCreate(Activity.java:5008) 08-28 20:54:10.496: W/System.err(1487): на android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 08-28 20:54:10.496: W/System.err(1487): на android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 08-28 20:54:10.496: W/System.err(1487): на android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 08-28 20:54:10.496: W/System.err(1487): на android.app.ActivityThread.access$600(ActivityThread.java:130) 08-28 20:54:10.496: W/System.err(1487): на android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 08-28 20:54:10.496: W/System.err(1487): на android.os.Handler.dispatchMessage(Handler.java:99) 08-28 20:54:10.496: W/System.err(1487): на android.os.Looper.loop(Looper.java:137) 08-28 20:54:10.496: W/System.err(1487): на android.app.ActivityThread.main(ActivityThread.java:4745) 08-28 20:54:10.496: W/System.err(1487): на java.lang.reflect.Method.invokeNative(родной метод) 08-28 20: 54: 10.496: W / System.err (1487): на java.lang. refle.Method.invoke(Method.java:511) 08-28 20:54:10.496: W/System.err(1487): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:786)) 08-28 20: 54: 10.496: W / System.err (1487): на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 08-28 20:54:10.496: W/System.err(1487): at dalvik.system.NativeStart.main(собственный метод)
2 ответа
Я много работаю над этой проблемой, я спросил разработчика на Github и, наконец, я обнаружил, что проблема была в строке пароля, а не из-за неправильного пароля, из-за символа Юникода в строке пароля, по некоторым причинам, если мы хотим получить Кодирование / декодирование отлично работает на всех устройствах и платформах, лучше выбрать символ ascii для пароля.
Первый:
http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html
http://docs.oracle.com/javase/8/docs/technotes/guides/io/troubleshooting.html
Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream
Я не уверен, что они создают какие-либо проблемы, но давайте попробуем это:
InputStream is = getResources().openRawResource(R.raw.troodon_ph);
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
try {
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
} catch (IOException e) {
e.printStackTrace();
}
byte[] data = baf.toByteArray();
Я надеюсь, что это работает, но дайте мне знать!
и в конце, если он не работает, убедитесь, что ваш файл зашифрован правильно.