카테고리 없음

예상질문 : AES

8나지 2024. 8. 27. 00:32

암호화

async encryption(data) {
    const iv = randomBytes(16);
    const cryptoPassword = this.configService.get('CRYPTO_PASSWORD');
    const key = (await promisify(scrypt)(cryptoPassword, 'salt', 32)) as Buffer;
    const cipher = createCipheriv('aes-256-ctr', key, iv);

    const encryptedata = Buffer.concat([cipher.update(data), cipher.final()]);

    const encryptedByConcatIvData = Buffer.concat([iv, encryptedata]).toString(
      'hex',
    );
//cipher.update(data)는 주어진 데이터를 암호화합니다.
// cipher.final()은 암호화 프로세스를 완료하고 남은 데이터를 처리합니다.
// Buffer.concat([...])는 두 개의 버퍼를 결합하여 최종 암호화된 데이터를 생성합니다.
// iv(초기화 벡터)를 암호화된 데이터 앞에 붙여서, 복호화 시 필요한 정보를 포함합니다.
// 마지막으로, .toString('hex')를 사용하여 결합된 데이터를 16진수 문자열로 변환합니다.

    return encryptedByConcatIvData;

 

복호화

private async decryption(data) {
    const encryptedDataBufferFromHex = Buffer.from(data, 'hex');

    const DataIv = encryptedDataBufferFromHex.slice(0, 16);
    const encryptedData = encryptedDataBufferFromHex.slice(16);

    const password = this.configService.get('CRYPTO_PASSWORD');
    const key = (await promisify(scrypt)(password, 'salt', 32)) as Buffer;
    const DataDecipher = createDecipheriv('aes-256-ctr', key, DataIv);

    const decryptedBufferData = Buffer.concat([
      DataDecipher.update(encryptedData),
      DataDecipher.final(),
    ]);

    const decryptedData = decryptedBufferData.toString();

    return decryptedData;
  }

 

왜 이걸 썻는지?

 

안성: AES는 강력 보안성을 제공하며, 현재까지 알려진 공격에 대해 안전하다고 평가고 있습니다.

 

 

 

: AES는 하드웨어와 소프트웨어에서 모두 빠르게 실행될  있어 성능 우수합니다

 

 

 

표준화: AES 미국 정부에 의해 표준으로 채택으며, 국제적으로 널리 사용되고 있습니다.

 

 

 

키 길이: AES는 128, 192, 256 비트의 다양한 키 길이를 지원하여 보안 수준을 조정할 수 있습니다.

 

 

5. 칭키 암호: AES는 대칭키 암화 방식으로, 동일 키로 암호화와 복호화를 수행하므로 구현이 간단합니다.

 

이러한 이유 AES는 데이터 보호 및 보안 신에 널리 사용됩니다.