package com.example.bankcards.util; import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class CardEncryptionUtil { @Value("${app.card.encryption-key}") private String encryptionKey; private static final String ALGORITHM = "AES"; public String encrypt(String cardNumber) { try { SecretKeySpec keySpec = new SecretKeySpec( encryptionKey.getBytes(), ALGORITHM ); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encrypted = cipher.doFinal(cardNumber.getBytes()); return Base64.getEncoder().encodeToString(encrypted); } catch (Exception e) { throw new RuntimeException("Failed to encrypt card number", e); } } public String decrypt(String encryptedCardNumber) { try { SecretKeySpec keySpec = new SecretKeySpec( encryptionKey.getBytes(), ALGORITHM ); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, keySpec); byte[] decoded = Base64.getDecoder().decode(encryptedCardNumber); byte[] decrypted = cipher.doFinal(decoded); return new String(decrypted); } catch (Exception e) { throw new RuntimeException("Failed to decrypt card number", e); } } public String mask(String cardNumber) { if (cardNumber == null || cardNumber.length() < 4) { return "****"; } String lastFour = cardNumber.substring(cardNumber.length() - 4); return "**** **** **** " + lastFour; } }