Я экспериментирую с библиотекой Crypto ++ и библиотекой javax.crypto.
Итак, что я пытаюсь сделать, это … зашифровать текстовый файл с использованием AES с режимом CFB в Java, а затем расшифровать зашифрованный файл с помощью crypto ++ в C ++
вот класс Java для шифрования
public class CryptoUtils {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/CFB8/NoPadding";
Charset CHARSET = Charset.forName("UTF8");
public static void encrypt(byte[] key, byte[] iv, File inputFile, File outputFile) throws CryptoException {
doCrypto(Cipher.ENCRYPT_MODE, key, iv, inputFile, outputFile);
}
public static void decrypt(byte[] key, byte[] iv, File inputFile, File outputFile) throws CryptoException {
doCrypto(Cipher.DECRYPT_MODE, key, iv, inputFile, outputFile);
}
private static void doCrypto(int cipherMode, byte[] key, byte[] iv, File inputFile, File outputFile)
throws CryptoException {
try {
Key secretKey = new SecretKeySpec(key, ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(cipherMode, secretKey, ivSpec);
FileInputStream inputStream = new FileInputStream(inputFile);
byte[] inputBytes = new byte[(int) inputFile.length()];
inputStream.read(inputBytes);
byte[] outputBytes = cipher.doFinal(inputBytes);
FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(outputBytes);
inputStream.close();
outputStream.close();
} catch (Exception e) {
throw new CryptoException("Error encrypting/decrypting file", e);
}
}
}
вот вызывающий класс с инициализированным ключом и iv …
public class Main {
public static void main(String[] args) {
byte[] key = new byte[16];
byte[] iv = new byte[16];
for(int i = 0; i < key.length; i++) {
key[i] = 0x0;
iv[i] = 0x0;
}
Charset CHARSET = Charset.forName("UTF8");
String keyStr = new String(key);
String ivStr = new String(iv);
File inputFile = new File("target.txt");
File encryptedFile = new File("target.enc");
File decryptedFile = new File("target.dec");
try {
//CryptoUtils.decrypt(keyStr.getBytes(CHARSET), ivStr.getBytes(CHARSET), encryptedFile, decryptedFile);
//CryptoUtils.encrypt(keyStr.getBytes(CHARSET), ivStr.getBytes(CHARSET), inputFile, encryptedFile);
CryptoUtils.encrypt(key, iv, inputFile, encryptedFile);
//CryptoUtils.decrypt(key, iv, encryptedFile, decryptedFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
и вот код C ++ …
byte key[AES::DEFAULT_KEYLENGTH];
byte iv[AES::DEFAULT_KEYLENGTH];
void encrypt64(char* in, char* out) {
CFB_Mode<AES>::Encryption e;
e.SetKeyWithIV(key, sizeof(key), iv);
FileSource f(in, true,
new StreamTransformationFilter(e,
new HexEncoder(new FileSink(out))));
}
void decrypt64(char* in, char* out) {
CFB_Mode<AES>::Decryption d;
d.SetKeyWithIV(key, sizeof(key), iv);
FileSource f(in, true,
new HexDecoder(new StreamTransformationFilter(d, new FileSink(out))));
}
int main() {
memset(key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH);
memset(iv, 0x00, CryptoPP::AES::BLOCKSIZE);
decrypt64("target.enc", "target.dec2");
return 0;
}
поскольку его кажущийся ключ и iv в обоих кодах одинаковы. все еще это не работает ..
Я был в эти часы сейчас … но, поскольку я новичок в криптографии и криптографических библиотеках .., поэтому не мог найти ответ или может быть найден, но не попал в мою голову …: /
в любом случае .. пожалуйста, дайте мне знать, что я делаю неправильно и как я могу это исправить … заранее спасибо 🙂
Задача ещё не решена.
Других решений пока нет …