第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

ZIP 文件的 AES 加密不正確的第二個(gè) 16 字節(jié)塊

ZIP 文件的 AES 加密不正確的第二個(gè) 16 字節(jié)塊

慕斯709654 2023-06-04 17:52:30
我正在使用 Java 的實(shí)現(xiàn)來(lái)實(shí)現(xiàn)Zip AESCipher加密。這是我的加密代碼:public final class AesEncoder implements Encoder {? ? private final Cipher cipher;? ? private final Mac mac;? ? private final byte[] salt;? ? private final byte[] derivedPasswordVerifier;? ? // AesStrength is an Enum with AES strength constants like salt or mac length? ? public static AesEncoder create(AesStrength strength, char[] password) throws Exception {? ? ? ? KeySpec spec = new PBEKeySpec(password, salt, 1000, strength.getSize());? ? ? ? SecretKey secretKey = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(spec);? ? ? ? byte[] iv = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };? ? ? ? Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");? ? ? ? cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secretKey.getEncoded(), "AES"), new IvParameterSpec(iv));? ? ? ? Mac mac = Mac.getInstance("HmacSHA1");? ? ? ? mac.init(new SecretKeySpec(macKey, "HmacSHA1"));? ? ? ? return new AesEncoder(cipher, mac, salt, derivedPasswordVerifier);? ? }? ? private static byte[] generateSalt(AesStrength strength) {? ? ? ? SecureRandom random = new SecureRandom();? ? ? ? byte[] buf = new byte[strength.getSaltLength()];? ? ? ? random.nextBytes(buf);? ? ? ? return buf;? ? }}我想加密以下文本:abcdefghijklmnopqrstuvwxyz沒(méi)有細(xì)節(jié),我encrypt()用兩個(gè)長(zhǎng)度為 16 字節(jié)的塊調(diào)用了方法兩次:abcdefghijklmnop和qrstuvwxyz。我有使用 AES 算法加密的正確 ZIP 文件。我在任何存檔器中打開(kāi)此 ZIP 文件,例如WinZip或WinRar并打開(kāi)加密文件。結(jié)果我有以下文字:abcdefghijklmnopÄÝB`CÙ∼Wi¯如您所見(jiàn),第一個(gè)塊已正確加密,但第二個(gè)塊未正確加密。我調(diào)查了這個(gè)問(wèn)題。我找到了一個(gè)名為zip4j 的工作解決方案,并發(fā)現(xiàn)了兩個(gè)不同之處:第一:這個(gè)庫(kù)有自定義 AES 實(shí)現(xiàn)AESEngine;我使用jdk實(shí)現(xiàn);第二:這個(gè)庫(kù)從第一個(gè)字節(jié)開(kāi)始增加初始化向量。第一個(gè)塊iv = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };第二塊iv = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };但是jdk 中使用的com.sun.crypto.provider.CounterMode從末尾遞增向量:第一個(gè)塊iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };第二塊iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };PS如果我設(shè)置初始向量iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
查看完整描述

1 回答

?
哆啦的時(shí)光機(jī)

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊

我已經(jīng)解決了這個(gè)問(wèn)題。問(wèn)題是 java 的 AES 實(shí)現(xiàn)與 ZIP 標(biāo)準(zhǔn)有點(diǎn)不同。


我已經(jīng)使用 java類在我的zip4jvmCypher庫(kù)中實(shí)現(xiàn)了 AES 加密:


class AesEncoder {

? ? public static AesEncoder create(AesStrength strength, char[] password) {

? ? ? ? try {

? ? ? ? ? ? byte[] salt = strength.generateSalt();

? ? ? ? ? ? byte[] key = AesEngine.createKey(password, salt, strength);


? ? ? ? ? ? Cipher cipher = AesEngine.createCipher(strength.createSecretKeyForCipher(key));

? ? ? ? ? ? Mac mac = AesEngine.createMac(strength.createSecretKeyForMac(key));

? ? ? ? ? ? byte[] passwordChecksum = strength.createPasswordChecksum(key);


? ? ? ? ? ? return new AesEncoder(cipher, mac, salt, passwordChecksum);

? ? ? ? } catch(Exception e) {

? ? ? ? ? ? throw new Zip4jvmException(e);

? ? ? ? }

? ? }

}


@RequiredArgsConstructor(access = AccessLevel.PACKAGE)

enum AesStrength {

? ? S128(128),

? ? S192(192),

? ? S256(256);


? ? private final int size;


? ? public final int saltLength() {

? ? ? ? return size / 16;

? ? }


? ? private int macLength() {

? ? ? ? return size / 8;

? ? }


? ? private int keyLength() {

? ? ? ? return size / 8;

? ? }


? ? public SecretKeySpec createSecretKeyForCipher(byte[] key) {

? ? ? ? return new SecretKeySpec(key, 0, keyLength(), "AES");

? ? }


? ? public SecretKeySpec createSecretKeyForMac(byte[] key) {

? ? ? ? return new SecretKeySpec(key, keyLength(), macLength(), "HmacSHA1");

? ? }


? ? public byte[] createPasswordChecksum(byte[] key) {

? ? ? ? final int offs = keyLength() + macLength();

? ? ? ? return new byte[] { key[offs], key[offs + 1] };

? ? }


? ? public byte[] generateSalt() {

? ? ? ? SecureRandom random = new SecureRandom();

? ? ? ? byte[] buf = new byte[saltLength()];

? ? ? ? random.nextBytes(buf);

? ? ? ? return buf;

? ? }


}


class AesEngine {

? ? private static final int ITERATION_COUNT = 1000;


? ? public static byte[] createKey(char[] password, byte[] salt, AesStrength strength) throws NoSuchAlgorithmException, InvalidKeySpecException {

? ? ? ? int keyLength = strength.getSize() * 2 + 16;

? ? ? ? KeySpec keySpec = new PBEKeySpec(password, salt, ITERATION_COUNT, keyLength);

? ? ? ? return SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(keySpec).getEncoded();

? ? }


? ? public static Cipher createCipher(SecretKeySpec secretKeySpec) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException {

? ? ? ? Cipher cipher = Cipher.getInstance("AES");

? ? ? ? // use custom AES implementation, so no worry for DECRYPT_MODE

? ? ? ? cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

? ? ? ? return cipher;

? ? }


? ? public static Mac createMac(SecretKeySpec secretKeySpec) throws NoSuchAlgorithmException, InvalidKeyException {

? ? ? ? Mac mac = Mac.getInstance("HmacSHA1");

? ? ? ? mac.init(secretKeySpec);

? ? ? ? return mac;

? ? }


}


查看完整回答
反對(duì) 回復(fù) 2023-06-04
  • 1 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)