저는 안드로이드에 익숙하지 않습니다. 이제는 미니 프로젝트의 일환으로 데이터를 암호화하고 숨기는 안드로이드 앱을 만들고 있습니다. AES 알고리즘을 사용하여 이미지를 암호화하고 해독하는 코드를 알려주십시오. ??안드로이드에서 이미지를 암호화하고 해독하는 방법은 무엇입니까?
답변
Java 암호화 라이브러리를 사용할 수 있습니다.
byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }; //Choose a key wisely
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
fis = new FileInputStream("some_img.png");
cis = new CipherInputStream(fis, cipher);
fos = new FileOutputStream("encrypted_img.enc");
byte[] b = new byte[8];
int i = cis.read(b);
while (i != -1) {
fos.write(b, 0, i);
i = cis.read(b);
}
fos.close();
이이 도움이되기를 바랍니다 여기 http://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/
는 AES로 암호화 및 암호 해독을위한 정적 메서드 더에서보기 : 여기에 당신이 할 수있는 일의 예입니다.
public static void encrypt (final byte[] key,
final String filename,
final String newFilename,
final Context context,
final EncryptionActionListener listener) {
final Handler uiHandler = new Handler();
final ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage(context.getString(R.string.encrypt_progress_message));
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.setProgress(0);
progressDialog.show();
Thread task = new Thread("Encrypt thread") {
public void run() {
boolean deleteSuccess = true;
boolean outOfMem = false;
boolean exception = false;
try {
File file = new File(filename);
int length = (int)file.length();
byte fileBytes[] = new byte[1024*100];
if (!createLeadingFolders(newFilename)) {
throw new IOException("Could not create folders in path " + newFilename);
}
InputStream is = new FileInputStream(filename);
OutputStream os = new FileOutputStream(newFilename);
AESOutputStream aos = new AESOutputStream(os, key, length);
int totalRead = 0;
int partialRead = 0;
while (true) {
partialRead = is.read(fileBytes);
if (partialRead == -1) {
break;
} else {
totalRead += partialRead;
aos.write(fileBytes, 0, partialRead);
final int percentage = (totalRead * 100)/length;
uiHandler.post(new Runnable() {
public void run() {
progressDialog.setProgress(percentage);
}
});
}
}
is.close();
aos.close();
os.close();
deleteSuccess = file.delete();
AESImageAdapter.delete(context, filename);
if (listener != null)
listener.onActionComplete();
Intent i = new Intent(ACTION_ENCRYPTED_FILES_CHANGED);
context.sendBroadcast(i);
} catch (OutOfMemoryError e) {
e.printStackTrace();
outOfMem = true;
} catch (Exception e) {
e.printStackTrace();
exception = true;
} finally {
progressDialog.dismiss();
if (exception) {
errorDialog(uiHandler, context.getString(R.string.encrypt_error), context);
} else if (outOfMem) {
errorDialog(uiHandler, context.getString(R.string.memory_error), context);
} else if (!deleteSuccess) {
errorDialog(uiHandler, context.getString(R.string.encrypt_delete_error), context);
}
}
}
};
task.start();
}
/**
* Asynchronously decrypt the chosen file.
* @param keyString Key to decrypt with
* @param filename Name of file to decrypt
* @param newFilename Name to save newly decrypted file
* @param dialog An optional progress dialog to update with progress
* @param adapter An optional adapter to notify when the encryption is finished
* @param context Must supply context
* @return
*/
public static void decrypt (final byte[] key,
final String filename,
final String newFilename,
final Context context,
final EncryptionActionListener listener) {
final Handler uiHandler = new Handler();
final ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage(context.getString(R.string.decrypt_progress_message));
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.setProgress(0);
progressDialog.show();
Thread task = new Thread("Decrypt thread") {
public void run() {
boolean deleteSuccess = true;
boolean outOfMem = false;
boolean exception = false;
try {
File file = new File(filename);
int length = (int)file.length();
byte fileBytes[] = new byte[1024*100];
if (!createLeadingFolders(newFilename)) {
throw new IOException("Could not create folders in path " + newFilename);
}
InputStream is = new FileInputStream(filename);
OutputStream os = new FileOutputStream(newFilename);
AESInputStream ais = new AESInputStream(is, key);
int totalRead = 0;
int partialRead = 0;
while (true) {
partialRead = ais.read(fileBytes);
if (partialRead == -1) {
break;
} else {
totalRead += partialRead;
os.write(fileBytes, 0, partialRead);
final int percentage = (totalRead * 100)/length;
uiHandler.post(new Runnable() {
public void run() {
progressDialog.setProgress(percentage);
}
});
}
}
ais.close();
is.close();
os.close();
deleteSuccess = file.delete();
// Run the media scanner to discover the decrypted file exists
MediaScannerConnection.scanFile(context,
new String[] { newFilename },
null,
null);
if (listener != null)
listener.onActionComplete();
Intent i = new Intent(ACTION_ENCRYPTED_FILES_CHANGED);
context.sendBroadcast(i);
} catch (OutOfMemoryError e) {
e.printStackTrace();
outOfMem = true;
} catch (Exception e) {
e.printStackTrace();
exception = true;
} finally {
progressDialog.dismiss();
if (exception) {
errorDialog(uiHandler, context.getString(R.string.decrypt_error), context);
} else if (outOfMem) {
errorDialog(uiHandler, context.getString(R.string.memory_error), context);
} else if (!deleteSuccess) {
errorDialog(uiHandler, context.getString(R.string.decrypt_delete_error), context);
}
}
}
};
task.start();
}
암호화의 자세한 예를 들어, 또는 AES와 함께 이미지 파일의 암호를 해독이 링크를 따라 할 수 https://github.com/charlesconnell/ImageHider/tree/master/src/com/connell/imagehider
이 링크가 질문에 대답 할 수 있지만 여기에 답변의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. –
감사합니다. 나는 내 대답을 편집 해 주셔서 감사합니다! @Hidden Hobbes –
나는 그것을 시도했지만 매우 느리다. – HendraWD
당신은 암호화 또는 비디오 나 이미지와 같은 미디어 파일을 해독하기 위해 다음과 같은 방법을 사용할 수 있습니다 -
을public class Encrypter {
private final static int DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE = 1024;
private final static String ALGO_VIDEO_ENCRYPTOR = "AES/CBC/PKCS5Padding";
@SuppressWarnings("resource")
public static void encrypt(SecretKey key,
AlgorithmParameterSpec paramSpec, InputStream in, OutputStream out)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IOException {
try {
Cipher c = Cipher.getInstance(ALGO_VIDEO_ENCRYPTOR);
c.init(Cipher.ENCRYPT_MODE, key, paramSpec);
out = new CipherOutputStream(out, c);
int count = 0;
byte[] buffer = new byte[DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE];
while ((count = in.read(buffer)) >= 0) {
out.write(buffer, 0, count);
}
} finally {
out.close();
}
}
@SuppressWarnings("resource")
public static void decrypt(SecretKey key, AlgorithmParameterSpec paramSpec,
InputStream in, OutputStream out)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IOException {
try {
Cipher c = Cipher.getInstance(ALGO_VIDEO_ENCRYPTOR);
c.init(Cipher.DECRYPT_MODE, key, paramSpec);
out = new CipherOutputStream(out, c);
int count = 0;
byte[] buffer = new byte[DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE];
while ((count = in.read(buffer)) >= 0) {
out.write(buffer, 0, count);
}
} finally {
out.close();
}
}
}
여기에 비디오를 암호화하고 있습니다. 다음은 이러한 방법을 사용하여 비디오 파일을 암호화하는 MainActivity입니다.
public class MainActivity extends AppCompatActivity {
private final static String ALGO_RANDOM_NUM_GENERATOR = "SHA1PRNG";
private final static String ALGO_SECRET_KEY_GENERATOR = "AES";
private final static int IV_LENGTH = 16;
Cursor mVideoCursor;
ArrayList<HashMap<String, String>> listOfVideo;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listOfVideo = new ArrayList();
String[] videoColumns = {MediaStore.Video.Media.DATA,MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.SIZE,MediaStore.Video.Media.DISPLAY_NAME};
mVideoCursor = getApplicationContext().getContentResolver().query
(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoColumns, null, null, null);
mVideoCursor.moveToFirst();
for (int i = 0; i < mVideoCursor.getCount(); i++) {
listOfVideo.add(new HashMap<String, String>() {
{
put("data", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.DATA))));
put("duration", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.DURATION))));
put("displayName", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME))));
put("size", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.SIZE))));
mVideoCursor.moveToNext();
}
});
}
String path = listOfVideo.get(0).get("data");
File inFile = new File(listOfVideo.get(0).get("data"));
File outFile = new File(path.substring(0, path.lastIndexOf("/"))+"/enc_video.swf");
File outFile_dec = new File(path.substring(0, path.lastIndexOf("/"))+"/dec_video.mp4");
try {
SecretKey key = KeyGenerator.getInstance(ALGO_SECRET_KEY_GENERATOR).generateKey();
byte[] keyData = key.getEncoded();
SecretKey key2 = new SecretKeySpec(keyData, 0, keyData.length, ALGO_SECRET_KEY_GENERATOR);
byte[] iv = new byte[IV_LENGTH];
SecureRandom.getInstance(ALGO_RANDOM_NUM_GENERATOR).nextBytes(iv);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
Encrypter.encrypt(key, paramSpec,
new FileInputStream(inFile), new FileOutputStream(outFile));
Encrypter.decrypt(key2, paramSpec,
new FileInputStream(outFile), new FileOutputStream(outFile_dec));
} catch (Exception e) {
e.printStackTrace();
}
}
}
아직 시도한 것이 있습니까? 어쩌면 문자열을 암호화/해독하려고 시도하면 바이트에 관한 모든 것을 알게 될 것입니다. – Yazan
예제가 많이 있습니다 - 검색 만하십시오. – Henry
지금까지 문자열을 암호화 했으므로 이제 이미지와 오디오를 암호화해야합니다 ... –