2023년 3월 13일 월요일

동형암호(Homomorphic Encryption)

동형암호(Homomorphic Encryption)란, 암호화된 데이터를 그대로 유지한 채로 암호화된 데이터에 대한 계산을 수행할 수 있는 암호화 기술입니다. 즉, 암호화된 데이터를 복호화하지 않고도, 암호화된 상태에서 더하기, 곱하기 등의 계산을 수행할 수 있는 기술입니다. 이를 통해 데이터를 보호하면서도, 클라우드 같은 제3자에게 데이터 처리를 위임할 수 있어서, 데이터 프라이버시와 보안을 동시에 보장할 수 있습니다. 동형암호는 기밀성, 무결성, 인증 등의 보안 요구사항을 충족시키는데 활용될 수 있으며, 예를 들어 의료, 금융, 보안 등에서 사용될 수 있습니다.

동형암호의 기초 개념은 1978년 Martin Hellman과 Whitfield Diffie가 발표한 논문 "Privacy and Authentication: An Introduction to Cryptography"에서 처음 제시되었습니다. 이후 2009년 Craig Gentry가 "A Fully Homomorphic Encryption Scheme"라는 논문에서 처음으로 완전 동형암호(Fully Homomorphic Encryption, FHE)를 제안했습니다. 그러나 이 논문에서 제안된 방법은 매우 느리고 복잡해서 실제 적용이 어렵다는 문제가 있었습니다. 이후 2010년에는 Gentry가 개선된 FHE 방식을 발표하였고, 2011년부터는 여러 연구자들이 이를 기반으로 다양한 형태의 동형암호 방식을 개발하고 있습니다.

동형암호는 대부분 공개키 암호화 방식을 기반으로 동작합니다. 일반적으로 두 가지 유형의 동형암호가 있습니다.

첫째, 완전 동형암호(Fully Homomorphic Encryption, FHE)는 암호화된 데이터에 대한 모든 계산을 수행할 수 있는 가장 강력한 유형의 동형암호입니다. 이 방식은 일반적으로 느리고 복잡하지만, 어떠한 계산도 수행할 수 있기 때문에 매우 강력한 보안성을 제공합니다.

둘째, 부분 동형암호(Partially Homomorphic Encryption, PHE)는 암호화된 데이터에 대해서는 일부 계산만을 수행할 수 있습니다. 예를 들어, 곱셈이나 덧셈 중 한 가지 연산만 가능한 경우가 대부분입니다. 하지만 이 방식은 FHE보다 간단하고 빠르기 때문에 상대적으로 덜 강력하지만, 많은 실제 응용에서 사용될 수 있습니다.

동형암호는 이러한 방식을 이용하여 암호화된 데이터에 대한 계산을 수행합니다. 이때 계산은 암호화된 상태에서 이루어지며, 암호화된 데이터는 계산을 위해 일부 변환되어야 할 수 있습니다. 이후, 계산 결과도 다시 암호화되어 반환됩니다.

완전 동형암호(Fully Homomorphic Encryption, FHE)를 다루는 코드는 일반적으로 상당히 복잡합니다. 여기서는 대표적인 FHE 라이브러리 중 하나인 Microsoft SEAL을 사용한 예시 코드를 보여드리겠습니다. 아래 예시 코드는 C++로 작성된 FHE 예시 코드입니다.

#include 
#include "seal/seal.h"

using namespace std;
using namespace seal;

int main() {
    // Create the context
    EncryptionParameters parms(scheme_type::bfv);
    parms.set_poly_modulus_degree(4096);
    parms.set_coeff_modulus(CoeffModulus::BFVDefault(4096));
    parms.set_plain_modulus(1024);
    auto context = SEALContext::Create(parms);

    // Create the public and secret keys
    KeyGenerator keygen(context);
    auto secret_key = keygen.secret_key();
    auto public_key = keygen.public_key();

    // Create the encoder and encryptor
    IntegerEncoder encoder(context);
    Encryptor encryptor(context, public_key);

    // Encrypt the plaintext value 10
    Plaintext plaintext = encoder.encode(10);
    Ciphertext encrypted;
    encryptor.encrypt(plaintext, encrypted);

    // Create the decryptor
    Decryptor decryptor(context, secret_key);

    // Decrypt the ciphertext and print the result
    Plaintext decrypted;
    decryptor.decrypt(encrypted, decrypted);
    cout << "Encrypted value: " << encrypted.to_string() << endl;
    cout << "Decrypted value: " << encoder.decode_int32(decrypted) << endl;

    // Perform a homomorphic addition on the ciphertext
    Ciphertext encrypted_sum;
    encryptor.encrypt(encoder.encode(5), encrypted_sum);
    evaluator.add_inplace(encrypted, encrypted_sum);

    // Decrypt the updated ciphertext and print the result
    decryptor.decrypt(encrypted, decrypted);
    cout << "Updated encrypted value: " << encrypted.to_string() << endl;
    cout << "Updated decrypted value: " << encoder.decode_int32(decrypted) << endl;

    return 0;
}

위 코드는 FHE 라이브러리인 Microsoft SEAL을 사용하여, 암호화된 값에 대해 덧셈 연산을 수행하는 코드입니다. 코드 내용 자세한 설명은 다소 복잡합니다만, SEAL 라이브러리의 기본적인 사용 방법과 암호화된 값에 대한 연산 처리 방식을 간단하게 이해할 수 있습니다.

동형암호에서는 일반적으로 공개키와 개인키가 존재합니다. 암호화된 데이터에 대한 계산은 공개키를 사용하여 수행됩니다. 따라서 계산을 수행하는 쪽에서는 공개키만 알면 됩니다. 개인키는 복호화나 계산 결과의 검증 등을 위해 필요합니다.

하지만 완전 동형암호(Fully Homomorphic Encryption, FHE)의 경우 계산의 복잡성이 높기 때문에, 실제로는 대개 부분 동형암호(Partially Homomorphic Encryption, PHE)를 사용하게 됩니다. PHE에서는 일반적으로 덧셈이나 곱셈 중 한 가지 연산만을 수행할 수 있기 때문에, 계산을 수행하기 위해서는 암호화된 데이터와 함께 연산 종류를 지정하는 등의 추가 정보가 필요할 수 있습니다.

동형암호는 암호화된 데이터에 대한 계산을 수행할 수 있는 고급 보안 기술로서, 다양한 분야에서 사용될 수 있습니다.

예를 들어, 의료 분야에서는 환자의 의료 데이터를 보호하면서도, 이를 분석하여 질병 예측이나 치료 방법 등을 개발할 수 있습니다. 금융 분야에서는 개인 금융 데이터의 보안을 보장하면서도, 데이터 분석을 통해 고객의 금융 상태를 파악하거나 투자 포트폴리오를 최적화할 수 있습니다. 또한 클라우드 컴퓨팅 분야에서는 사용자의 데이터 보호를 보장하면서도, 클라우드 서비스를 이용하여 데이터 처리를 위한 연산을 아웃소싱할 수 있습니다.

그 외에도 동형암호는 기밀성, 무결성, 인증 등의 보안 요구사항을 충족시키는데 활용될 수 있으며, 예를 들어 데이터 검색, 보안 분석, 기계 학습 등 다양한 분야에서 활용될 수 있습니다.