Я написал этот код в Angular для шифрования строки:
import { Injectable } from '@angular/core';
import * as CryptoJS from 'crypto-js';
@Injectable({
providedIn: 'root',
})
export class CryptoService {
encrypt(message: string, clef: string): string {
const salt = CryptoJS.SHA256("123456789123");
const key = CryptoJS.PBKDF2(clef, salt, {
keySize: 128 / 32,
iterations: 1000
});
// var key = CryptoJS.enc.Utf8.parse(clef);
let iv = CryptoJS.enc.Utf8.parse(clef);
let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(message.toString()), key,
{
keySize: 128 / 8,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// var encryptedMessage = CryptoJS.AES.encrypt(message.trim(), key).toString();
return encrypted.toString();
}
generateKey(): string {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
let counter = 0;
while (counter < 16) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}
}
Я передаю свой ключ и encriptedMessage обратно для расшифровки.
Я кодирую на java:
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
public class AESUtilService {
protected static final String salt = "123456789123";
public SecretKey getKeyFromPassword(String password)
throws NoSuchAlgorithmException, InvalidKeySpecException {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 1000, 128/32);
SecretKey secret = factory.generateSecret(spec);
return secret;
}
public String decrypt(String cipherText, SecretKey key)
throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException, InvalidKeyException,
BadPaddingException, IllegalBlockSizeException {
String algorithm = "AES/CBC/PKCS7Padding";
IvParameterSpec iv = new IvParameterSpec("MnTQLHcWumIKTXpQ".getBytes());
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, key, iv);
byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
return new String(plainText);
}
}
Моя проблема заключается в следующем.
Часть кода Cipher cipher = Cipher.getInstance(algorithm);
вылетает в java, если я использую String algorithm = "AES/CBC/PKCS7Padding";
Однако это пройдет с String algorithm = "AES/CBC/PKCS5Padding";
, но на этот раз это угловой, который рухнет. заполнение: CryptoJS.pad.Pkcs5
Я не могу найти решение этой проблемы, и поэтому я прошу вашей помощи.
Наконец-то я нашел сообщение, в котором говорилось, что pkcs5 в java такие же, как pkcs7 в angular -->заполнение (128)
Судя по вашему коду, существует проблема с вашим PBEKeySpec и спецификацией длины ключа. JAVA: вам необходимо использовать «AES/CBC/PKCS5Padding» вместо «AES/CBC/PKCS7Padding». Angular: внесите изменения в длину ключа и PBEKeySpec пусть зашифровано = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("hasan test"), ключ, { размер ключа: 16, IV: IV, режим: CryptoJS.mode.CBC, заполнение: CryptoJS.pad.Pkcs7 }).нанизывать();