我有幾天讀這篇文章,大約javax.crypto中的其他教程
Using block modes and initialisation vectors in Java我怎樣才能最好地保護IV和密鑰密碼,在此javax.crypto中的服務器客戶端
下面我的測試代碼是一個客戶端誰將數據發送到服務器。
我讀了關於不同的塊模式和CFB8流模式似乎工作,因爲我分割任意大小的文件。除了最後一個較小的塊以外,每個塊都是0.5MB,它們會一個接一個地發送到將文件放回在一起的服務器。
我有幾個問題:
1)我應該使用非對稱加密公佈/私法鍵發送SecretKeySpec密碼和IV到服務器之前,我開始轉移?
2)用於保護IV的SecretKeySpec密碼是什麼?
客戶端加密數據
Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec("password12345678".getBytes(), "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
out.write(iv); //Send IV to Server
out.flush();
// THE ENCRYPTET STREAM
cos = new CipherOutputStream(out, cipher);
while ((val = byteArrayInputStream.read(buffer, 0, 1024)) > 0) {
cos.write(buffer, 0, val);
cos.flush();
}
cipher.doFinal()
THE SERVER解密數據
byte[] iv = new byte[16];
in.read(iv);
Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec("password12345678".getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
cos = new CipherInputStream(in, cipher);
while (offset < tmpBuffer.length && (numRead=cos.read(tmpBuffer, offset, tmpBuffer.length-offset)) >= 0) {
offset += numRead;
savedFileSize = savedFileSize + numRead;
}
// CREATE HASH FROM THE DOWNLOAD CHUNK PART
String retCrC = DoEncryption.getCRC32ChecksumFromArray(tmpBuffer);
String hash2 = Long.toHexString(Long.parseLong(retCrC));
// TEST SO THE REMOTE HASH MATCH THE LOCAL HASH
if(!hash1.equals(hash2)){
...
是的,你的權利SSL來想到它。此代碼現在正在生產中名爲SPRiiD的Android應用程序中。我想先試試這個CipherOutputStream,以便了解一些東西是如何工作的,然後深入SSL – Erik
@Erik你應該閱讀Java的Beginning Cryptography。這是王牌。 –
感謝愛它,但沒有足夠的時間去那麼深。如果我現在切換到SSL,可以推薦一些適用於Android SSL的教程。不是在談論自簽名證書。我意識到這個話題是巨大的,也許SSL與CA更容易 – Erik