ABOUT ME

-

  • Secure Flash - 서명이란?
    카테고리 없음 2025. 3. 10. 22:02

    시작하기 전에 

     

    요즘 자동차들은 통신으로 외부와 연결되어 있다. 와이파이, LTE, 5G, 블루투스, UWB, NFC 등 외부 통신의 방법은 다양하다. 외부와 통신으로 "연결"된 덕택에 운전자와 탑승자들은 전에 없던 편안함과 안전을 누린다. 이런 것들을 총칭하여 커넥티비티(connectivity)라고 한다. 

     

    커넥티비티가 가져온 자동차 패러다임의 큰 변화가 있다. SDV (Software Defined Vehicle)이다. 소프트웨어 업데이트로 기능이 더 좋아지거나 없던 기능이 생긴다. 소프트웨어로 차가 달라진다. 소프트웨어로 차가 정의된다. 

     

    커넥티비티 이전에도 소프트웨어 업데이트는 가능했다. 하지만 시간, 노력이 매우 많이 들었다. 누군가가 일일이 차를 찾아다니며 혹은 차가 누군가에에 가도록 하여 한 대씩 업데이트를 해야만 했다. 커넥티비티 덕택에 서버와 차가 직접 소통하여 소프트웨어 업데이트가 가능하다.  

     

     

     커넥티비티와 소프트웨어 업데이트는 사이버 보안 위험을 함께 가져왔다.  

     

    Connectivity & Software

    Cyber Security

     

     

    체로키 해킹은 많은 자동차 사이버 보안 관련된 사람들이 터닝 포인트로 꼽는 사건이다. 아래에 유튜브 링크를 추가한다. 

     

    Hackers Remotely Kill a Jeep on a Highway | WIRED

     

    비디오를 보면 해커들은 먼저 차의 헤드 유닛(a.k.a AVNT (Audio Video Navigation Telematics)을 자신들의 소프트웨어로  업데이트 한다. (헤드 유닛 화면이 해커들 그림으로 바뀌는 장면을 기억할 것이다. 그 순간이다.) 그리고 이를 통해 원격으로 차의 오디오, 와이퍼, 구동(엔진), 제동, 조향 시스템들을 제어한다. 

     

    나는 지난 블로그 시리즈에서 소프트웨어 업데이트를 설명하였다. (UDS 진단 통신으로 하는 소프트웨어 업데이트 1 - 작업 개요 :: hsl's tsmaster 사용기) 소프트웨어 업데이트 과정을 보면 시드&키로 접속을 통제하는 보안 장치가 있다. 해킹된 체로키에도 시드&키가 있었을 것으로 짐작한다. 다만 시드&키가 발전한 해킹 기술에 비해 보안성이 부족했을 것으로 짐작한다. 그래서 요즘은 접속 제어의 보안성을 더 높인 시드&키(이를 시큐어 액세스(Secure Access)라고 부른다.)나 외부와 차량의 연결점에 시드&키 보다 보안성이 높은 시큐어 언락 (Secure Unlock)을 적용한다.

     

    시큐어 액세스에 더해서 시큐어 플래시(이 글의 제목이다.)라는 것도 적용한다. 제어기에 소프트웨어가 저장되는 곳이 플래시 메모리라서 소프트웨어 업데이트를 "플래시한다"라고 흔히 표현한다. 그런 연유로 사이버 보안 측면에서 안전한 소프트웨어 업데이트를 시큐어 플래시라고 부른다. 시큐어 플래시는 일반 플래시와 달리 업데이트할 소프트웨어에 서명(sign)이 추가되어 있다.(서명이 무엇인지 나중에 설명한다.)  제어기는 서명을 확인하여 모르는 서명의 소프트웨어는 플래시하지 않고 버린다. 보안성을 더 높이기 위해 소프트웨어를 암호화(encryption) 하기도 한다. 제어기는 서명 검증이 완료된 소프트웨어를 복호화(decryption) 한 후에 플래시한다.

     

    시큐어 플래시의 설명에 도전한다.

     

     

    개요

    • 암호화와 복호화
      • 대칭키 암호화
      • 비대칭키 암호화
        • RSA 알고리즘으로 살펴보는 비대칭키 암호화
    • 대칭키 암호화와 비대칭키 암호화 비교
    • 시큐어 플래시
      • 디지털 서명
      • 키 배포

     

     

    암호화와 복호화

    대칭키 암호화 (symmetric cryptography)

    • 예를 들어서 "Hello TSMaster"의 각 글자를 ASCII 코드의 바로 다음 글자로 바꾼다면 아래와 같이 된다.
    평문  : Hi TSMaster
    암호문: Ij!UTNbtufs    H의 다음은 I, i의 다음은 j, 빈 칸의 다음은 ! ...

     

    • 바로 다음 글자가 아니라 3번째 다음 글자로 바꾼다면 아래와 같이 된다. 
    평문  : Hi TSMaster
    암호문: Kl#WVPdvwhu    H의 세 번째 다음 글자는 K, ...
    • 위 두 예는 동일한 암호화 방식이다. 앞의 예와 뒤의 예는 몇 번째 글자로 대체하는지만 다르다. 앞의 예는 1 번째 글자로, 뒤의 예는 3 번째 글자로 대체한다. 1, 3을 "키"라고 한다.
    • 암호문을 평문으로 바꾸는 과정을 복호화라고 한다. 이 예제의 복호화에는 암호화에 사용된 것과 동일한 키를 사용한다. 암호화 과정에서 평문의 글자를 1 번째 (3 번째) 다음 글자로 대체했다면, 복호화 과정에서는 1 번째 (3 번째) 이전 글자로 대체한다. 이렇게 동일한 키를 사용하여 암호화와 복호화 하는 방식을 대칭키 암호화라고 한다.
    • 이 방법은 Shift Cipher라고 한다. 시저가 사용한 방식으로 Caesar's Cipher라고도 불리운다.

     

    비대칭키 암호화 (asymmetric cryptography)

    • 대칭키 암호화가 암호화와 복호화에 동일한 키를 사용한다면, 암호화와 복호화에 서로 다른 키를 사용하는 비대칭키 암호화가 있다.
    • 비대칭키 암호화 방식은 수(number)의 "특징"을 이용한다. 많이 쓰이는 RSA( Rivest-Shamir-Adleman 세 사람이 발견하여 RSA라고 한다.) 알고리즘으로 비대칭키 방식을 설명한다.

    RSA 알고리즘으로 살펴보는 비대칭키 암호화

    • 두 소수를 고른다. P = 7, Q = 17
    • P와 Q의 곱 N을 구한다. N = P * Q = 7 * 17 = 119    
    • P, Q, N에서 한 쌍의 키를 추출할 것이다. 암호화에 사용할 키를 E(Encryption), 복호화에 사용할 키를 D(Decryption)이라고 부르겠다.
    •  E를 아래 조건들을 만족하는 수들 중에서 "선택"한다.
      • E는 (P - 1) * (Q - 1)의 인수가 아니고, 1 보다 크고 (P - 1) * (Q - 1) 보다 작다.
        • (7 - 1) * (17 - 1) = 8 * 16 = 96
        • 96을 소인수 분해하면, 96 = 2 * 2 * 2 * 2 * 2 * 3
        • E는 2나 3의 배수가 아니어야 한다. 
      • 이런 수는 5, 11, 13 ... 91  등이 있다.  
      • E로 5를 선택한다. (11, 13, ... 91 중 어떤 것을 선택해도 된다.)
        • P, Q를 아주 큰 값으로 고른다면 E로 선택할 수 있는 수들이 매우 많다. 선택이 많다는 것은 암호를 깨는 입장에서는 시간과 노력이 많이 든다는 의미이다. 그래서 중요하다. 
    • D를 아래 조건들을 만족하는 수들 중에서 "선택"한다.
      • (D * E) mod (P -1) x (Q - 1)  = 1
        • (D * 5) mod (96) = 1
        • D * 5는 96으로 나눴을 때 나머지가 1인 수이다. 
        • D * 5 = 97 or 193 or 289 or 385 or 481 or 577 or 673 or 769 or 865 or 961 or ...
        • D = 97 / 5 or 193  / 5  or 289  / 5  or 385  / 5  or 481  / 5  or 577  / 5  or 673  / 5  or 769  / 5  or 865  / 5  or 961  / 5  or ...
        • D = 19.4 or 38.6 or 57.8 or 77 or 96.2 or 115.4 or 134.6 or 153.8 or 173 or 192.2 or ...
      • D로 77을 선택한다. (173, ... 중 어떤 것을 선택해도 된다.)
    • 아래의 방법으로 암호화를 한다. 
      • CT = PT^E mod N
        • CT: 암호문. cipher text
        • PT: 평문. plain text
      • 예) 
        • PT = 10
        • CT = 10 ^ 5 mod 119 = 100,000 mod 119 = 40
    • 아래의 방법을 복호화를 한다.
      • PT = CT^D mod N
      • 예)
        • CT = 40
        • PT = 40^77 mod 119 = 10
    • 이런 신기한 수의 특징을 찾아내다니 대단하다. 
    • 아래 코드는 RSA의 계산 과정과 암/복호화의 이해를 돕기 위해 Claude AI에게 작성 요청한 코드이다. 내게는 RSA 알고리즘을 이해하는데 도움이 되었다.
    """
    RSA 암호화 알고리즘 예제 - 작은 수를 사용한 설명용 구현
    주의: 이 코드는 교육 목적으로만 사용해야 합니다. 
    실제 암호화에는 더 큰 소수와 전문 라이브러리를 사용해야 합니다.
    """
    
    import math
    
    
    def is_prime(n):
        """주어진 수가 소수인지 확인합니다."""
        if n <= 1:
            return False
        if n <= 3:
            return True
        if n % 2 == 0 or n % 3 == 0:
            return False
        i = 5
        while i * i <= n:
            if n % i == 0 or n % (i + 2) == 0:
                return False
            i += 6
        return True
    
    
    def gcd(a, b):
        """두 수의 최대공약수를 계산합니다 (유클리드 알고리즘)."""
        while b:
            a, b = b, a % b
    
        return a
    
    
    def mod_inverse(e, phi):
        """확장 유클리드 알고리즘을 사용하여 e의 모듈러 역원을 찾습니다.
        d * e ≡ 1 (mod phi)를 만족하는 d를 계산합니다."""
        def extended_gcd(a, b):
            if a == 0:
                return b, 0, 1
            else:
                gcd, x, y = extended_gcd(b % a, a)
                return gcd, y - (b // a) * x, x
        
        gcd, x, y = extended_gcd(e, phi)
        if gcd != 1:
            raise ValueError("모듈러 역원이 존재하지 않습니다.")
        else:
            return x % phi
    
    
    def generate_keypair(p, q):
        """
        RSA 키 쌍을 생성합니다.
        
        1. 두 소수 p, q를 선택합니다.
        2. n = p * q를 계산합니다.
        3. 오일러 토티언트 함수 φ(n) = (p-1)(q-1)을 계산합니다.
        4. 1 < e < φ(n)이고 gcd(e, φ(n)) = 1인 정수 e를 선택합니다.
        5. d * e ≡ 1 (mod φ(n))을 만족하는 d를 계산합니다.
        
        공개키는 (e, n), 개인키는 (d, n)입니다.
        """
        if not (is_prime(p) and is_prime(q)):
            raise ValueError("p와 q는 소수여야 합니다.")
        if p == q:
            raise ValueError("p와 q는 서로 다른 소수여야 합니다.")
        
        # n = p * q 계산
        n = p * q
        
        # φ(n) = (p-1)(q-1) 계산
        phi = (p - 1) * (q - 1)
        
        # e 선택: 1 < e < φ(n) 이고 gcd(e, φ(n)) = 1
        e = 65537  # 일반적으로 사용되는 값
        
        # 작은 수를 위한 예제에서는 더 작은 e 값 찾기
        for i in range(3, phi, 2):
            if gcd(i, phi) == 1:
                e = i
                break
        
        # 개인키 d 계산: d * e ≡ 1 (mod φ(n))
        d = mod_inverse(e, phi)
        
        # 공개키와 개인키 반환
        public_key = (e, n)
        private_key = (d, n)
        
        return public_key, private_key
    
    
    def encrypt(message, public_key):
        """
        공개키로 메시지를 암호화합니다.
        암호화 과정: c = m^e mod n
        여기서 m은 평문 메시지, (e,n)은 공개키, c는 암호문입니다.
        """
        e, n = public_key
        # 각 문자를 암호화
        encrypted = [pow(ord(char), e, n) for char in message]
        return encrypted
    
    
    def decrypt(encrypted, private_key):
        """
        개인키로 암호문을 복호화합니다.
        복호화 과정: m = c^d mod n
        여기서 c는 암호문, (d,n)은 개인키, m은 복호화된 메시지입니다.
        """
        d, n = private_key
        # 각 암호화된 값을 복호화
        decrypted = [chr(pow(char, d, n)) for char in encrypted]
        return ''.join(decrypted)
    
    # 예제 실행
    def main():
        # 1. 두 소수 선택 (실제로는 훨씬 큰 소수를 사용)
        p = 11
        q = 13
        
        print(f"선택한 소수: p={p}, q={q}")
        
        # 2. 키 쌍 생성
        public_key, private_key = generate_keypair(p, q)
        e, n = public_key
        d, n = private_key
        
        print(f"공개키 (e,n): ({e},{n})")
        print(f"개인키 (d,n): ({d},{n})")
        print(f"n = p * q = {p} * {q} = {n}")
        print(f"φ(n) = (p-1)(q-1) = {p-1} * {q-1} = {(p-1)*(q-1)}")
        print(f"e와 φ(n)의 최대공약수: {gcd(e, (p-1)*(q-1))}")
        print(f"d * e mod φ(n) = {d} * {e} mod {(p-1)*(q-1)} = {(d*e) % ((p-1)*(q-1))}")
        
        # 3. 평문 메시지
        message = "HI"
        print(f"\n원본 메시지: {message}")
        
        # 4. 메시지 암호화
        encrypted = encrypt(message, public_key)
        print(f"암호화된 메시지 (숫자 배열): {encrypted}")
        
        # 5. 메시지 복호화
        decrypted = decrypt(encrypted, private_key)
        print(f"복호화된 메시지: {decrypted}")
        
        # 암호화 과정 자세히 보기
        print("\n암호화 과정 세부 설명:")
        for i, char in enumerate(message):
            m = ord(char)  # 문자의 ASCII 값
            c = encrypted[i]  # 암호화된 값
            print(f"문자 '{char}' (ASCII: {m}):")
            print(f"암호화: c = m^e mod n = {m}^{e} mod {n} = {c}")
        
        # 복호화 과정 자세히 보기
        print("\n복호화 과정 세부 설명:")
        for i, c in enumerate(encrypted):
            m = pow(c, d, n)  # 복호화된 ASCII 값
            char = chr(m)     # ASCII 값을 문자로 변환
            print(f"암호문 {c}:")
            print(f"복호화: m = c^d mod n = {c}^{d} mod {n} = {m} => '{char}'")
    
    if __name__ == "__main__":
        main()

     

    • 코드 실행 결과는 아래와 같다.
    선택한 소수: p=11, q=13
    공개키 (e,n): (7,143)
    개인키 (d,n): (103,143)
    n = p * q = 11 * 13 = 143
    φ(n) = (p-1)(q-1) = 10 * 12 = 120
    e와 φ(n)의 최대공약수: 1
    d * e mod φ(n) = 103 * 7 mod 120 = 1
    
    원본 메시지: HI
    암호화된 메시지 (숫자 배열): [19, 83]
    복호화된 메시지: HI
    
    암호화 과정 세부 설명:
    문자 'H' (ASCII: 72):
    암호화: c = m^e mod n = 72^7 mod 143 = 19
    문자 'I' (ASCII: 73):
    암호화: c = m^e mod n = 73^7 mod 143 = 83
    
    복호화 과정 세부 설명:
    암호문 19:
    복호화: m = c^d mod n = 19^103 mod 143 = 72 => 'H'
    암호문 83:
    복호화: m = c^d mod n = 83^103 mod 143 = 73 => 'I'

     

     

    대칭키 암호화와 비대칭키 암호화 비교

    • 직접 쓰기에 지식도 충분하지 않고 시간도 없어서 Claude AI에게 문의했다.
    더보기

    프람프트: 대칭키 암호화와 비대칭키 암호화를 암호 해독 관점에서 (강건성) 비교해 주세요.

     

    대칭키 암호화와 비대칭키 암호화를 암호 해독 관점에서 비교해 드리겠습니다.

    대칭키 암호화의 강건성

    1. 키 길이와 복잡성: 현대 대칭키 알고리즘(AES 등)은 128, 192, 256비트의 키를 사용하며, 이 길이의 키를 무차별 대입(brute force) 공격으로 해독하는 것은 현실적으로 불가능합니다.
    2. 알고리즘 강도: AES와 같은 현대 대칭키 알고리즘은 수학적으로 매우 견고하게 설계되어 있어 현재까지 실용적인 암호해독 방법이 발견되지 않았습니다.
    3. 취약점:
      • 키 관리가 주요 취약점입니다. 양쪽이 동일한 키를 안전하게 공유해야 합니다.
      • 키가 유출되면 모든 통신이 해독 가능해집니다.
      • 다수의 사용자 간 통신 시 키 관리가 복잡해집니다(n명이 통신하려면 n(n-1)/2개의 키가 필요).

    비대칭키 암호화의 강건성

    1. 수학적 복잡성: RSA와 같은 알고리즘은 큰 정수의 소인수분해 문제와 같은 수학적 난제에 기반합니다. 이러한 문제는 계산적으로 해결하기 매우 어렵습니다.
    2. 키 길이: 일반적으로 2048, 4096비트 등 대칭키보다 훨씬 긴 키를 사용하며, 이는 무차별 대입 공격에 대해 높은 보안성을 제공합니다.
    3. 취약점:
      • 양자 컴퓨팅의 발전으로 인한 잠재적 위험(Shor 알고리즘을 통해 소인수분해 문제를 효율적으로 해결 가능)
      • 키 길이가 충분하지 않을 경우 현대적인 컴퓨팅 파워로 해독 가능성 존재
      • 구현상의 오류나 부채널 공격(side-channel attacks)에 취약할 수 있음

    실제 암호 해독 저항성 비교

    1. 계산 복잡성:
      • 대칭키: 키 길이에 따라 지수적으로 복잡도 증가 (2^n)
      • 비대칭키: 키 길이에 따라 아지수(sub-exponential) 복잡도 증가 (일반적으로 더 복잡)
    2. 양자 컴퓨팅 저항성:
      • 대칭키: Grover 알고리즘으로 인해 안전성이 감소하나 키 길이를 두 배로 늘리면 대응 가능
      • 비대칭키: Shor 알고리즘으로 인해 RSA, ECC 등 현재 널리 사용되는 비대칭 암호는 심각한 위협 직면
    3. 실제 보안 구현:
      • 실제로는 두 방식을 혼합하여 사용하는 것이 일반적 (하이브리드 암호화)
      • 비대칭키로 세션 키를 안전하게 교환한 후, 실제 데이터는 더 효율적인 대칭키로 암호화
    4. 암호 해독 방어책:
      • 대칭키: 정기적인 키 순환, 안전한 키 관리, 충분한 키 길이 사용
      • 비대칭키: 더 긴 키 사용, 양자 내성 암호(PQC) 알고리즘으로의 전환 준비

    요약하자면, 두 방식 모두 적절히 구현될 경우 현재 기술로는 해독이 매우 어렵습니다. 그러나 키 관리 방식과 양자 컴퓨팅에 대한 저항성에서 차이가 있으며, 이로 인해 각각의 강점과 약점이 존재합니다.

     

    • 요약하면 대칭키 암호화가 비대칭키 암호화에 비해서 더 빠르고 더 강건하다. 그렇다면 왜 비대칭 암호화를 사용하는가? 역시 Claude AI의 문의하였다. 
    더보기

    프람프트: 위 설명에 따르면 대칭키 암호화가 비대칭키 암호화 보다 좋은 것 같습니다. 비대칭키 암호화가 꼭 사용되어야 하는 이유가 있겠죠. 비대칭키 암호화가 대칭키 암호화 대비 갖고 있는, 대칭키 암호화가 제공하지 못하는 이점은 무엇인가요?

     

     

    비대칭키 암호화가 대칭키 암호화 대비 가지는 필수적인 장점들은 다음과 같습니다:

    비대칭키 암호화의 고유 이점

    1. 키 배포 문제 해결
      • 대칭키의 가장 큰 문제는 통신 전에 양쪽이 안전하게 동일한 키를 공유해야 한다는 점입니다.
      • 비대칭키는 공개키를 안전하지 않은 채널로 자유롭게 공유할 수 있어 사전 키 교환 없이도 안전한 통신이 가능합니다.
    2. 디지털 서명 지원
      • 비대칭키만이 디지털 서명을 구현할 수 있습니다.
      • 발신자가 개인키로 메시지에 서명하면, 모든 사람이 공개키로 그 서명을 검증할 수 있습니다.
      • 이는 메시지의 출처 인증과 무결성 확인에 필수적입니다.
    3. 부인방지(Non-repudiation) 제공
      • 발신자는 자신의 개인키로 서명한 메시지를 나중에 부인할 수 없습니다.
      • 법적 계약, 전자상거래 등에서 매우 중요한 보안 속성입니다.
    4. 확장성이 뛰어난 키 관리
      • n명의 사용자가 있을 때, 대칭키는 n(n-1)/2개의 키가 필요하지만(모든 사용자 쌍마다 고유 키)
      • 비대칭키는 단지 2n개(각 사용자당 공개키와 개인키 한 쌍)만 필요합니다.
    5. 인증 체계 구축 가능
      • PKI(공개키 기반구조)를 통해 디지털 인증서와 같은 신뢰 체계를 구축할 수 있습니다.
      • 대규모 네트워크에서 신원 검증과 암호화를 동시에 제공합니다.
    6. 세션 키 교환의 안전성
      • TLS/SSL과 같은 프로토콜에서 초기 연결 시 비대칭키를 사용해 세션 키를 안전하게 교환합니다.
      • 이후 통신은 효율적인 대칭키로 진행하는 하이브리드 접근법을 가능하게 합니다.
    7. 일방향 통신 지원
      • 수신자가 현재 온라인 상태가 아니어도 발신자는 수신자의 공개키를 사용해 메시지를 암호화할 수 있습니다.
      • 이메일 암호화와 같은 비동기 통신에 필수적입니다.
    8. 영지식 증명 기반
      • 비대칭키는 영지식 증명, 검증 가능한 암호화 투표 등 고급 암호 프로토콜의 기반이 됩니다.
      • 블록체인과 같은 분산 시스템에서 핵심적인 역할을 합니다.

    실제로는 대칭키와 비대칭키 모두 각자의 장단점을 가지고 있어, 현대 암호 시스템은 두 방식을 결합하는 경우가 많습니다. 비대칭키로 안전하게 대칭키를 교환한 후, 실제 데이터 암호화는 효율적인 대칭키로 수행하는 방식입니다. 이렇게 하면 양쪽의 장점을 모두 활용할 수 있습니다.

    • 위 장점들 중에 "키 배포 문제 해결"과 "디지털 서명 지원"이 시큐어 플래시에 비대칭 암호화가 사용되는 이유일 것이다.

     

    시큐어 플래시

    디지털 서명

    • 시큐어 플래시에서 중요한 것은 업데이트할 소프트웨어를 누가 보냈는지 확인할 수 있어야 한다는 것이다. 자동차사가 보낸 것인지 해커가 보낸 것인지 말이다.
    • 비대칭키 암호화는 위 RSA 예에서 설명한 것처럼 한 쌍의 짝이 맞는 키들이 있어야 암호화와 복호화를 할  수 있다.
    • 암호용 키를 자동차사가 갖고 있고, 자동차사는 소프트웨어의 해쉬값을 계산하고, 그 해쉬값을 암호용 키로 암호화하고, 암호화된 해쉬값을 소프트웨어에 붙인 후 (이를 서명한다고 한다.) 전송한다. 
    • 제어기들은 복호용 키를 갖고 있고, 제어기는 수신한 소프트웨어에서 해쉬값을 계산하고, 수신한 암호화된 해쉬값을 복호하고, 계산한 해쉬값과 복호한 해쉬값을 비교하고 (서명을 검증한다고 한다.) 서명이 검증되면 수신한 소프트웨어로 플래시를 실시한다. 그렇지 않으면 버린다. 

     

    시큐어 플래시: 소프트웨어 서명과 검증

     

     

    키 배포

    • 대칭키 암호화에서는 키를 노출하면 암호화는 효력을 잃는다. 그래서 제어기 안에 대칭키를 안전하게 저장할 수 있는 별도의 물리적인 저장 공간(secure storage, 보안 저장소)이 꼭 필요하다. 
    • 비대칭키 암호화에서는 해커가 복호용 키를 알아도 암호화를 할 수 없다. 그래서 복호용 키를 보안 저장소에 두지 않아도 된다. (소프트웨어의 서명만 고려하면 그렇다. 소프트웨어 유출과 리버스 엔지니어링 등을 고려하면 비대칭키도 보안 저장소에 보관할 필요가 있을 수도 있다.)
    • 보안 저장소는 비싸다.
      • 차 한 대에 제어기가 50개 정도 들어간다고 가정하자.
      • 1년에 차를 100만대를 생산한다고 가정하자.
      • 보안 저장소 칩이 개당 100원이라고 가정하자.
      • 칩이 새로 들어간다는 것은 PCB를 다시 개발한다는 의미이다. 즉, 개발비가 추가된다.
      • 칩을 조립하는 비용도 추가된다.
      • 조립을 하면 불량도 발생한다. 불량품으로 인한 품질 비용도 추가된다.
      • 이 모든 비용을 합쳐서 칩당 200원이라고 가정하자.
      • 차는 5년 이상 생산하지만 5년이라고 가정하자.
      • 그러면 보안 저장소 칩으로 인한 총 비용 증가는 200원/제어기 x 50 제어기/차 x 100만차/년 x 5년 = 500억원이다. 
      • 2024년 현대자동차의 영업 이익률은 8.1%이다. 500억원의 이익을 내려면 6,170억원어치 차를 팔아야 한다. 
      • 원가 절감이 중요한 이유이다. 

     

    앞(UDS 진단 통신으로 하는 소프트웨어 업데이트 1 - 작업 개요 :: hsl's tsmaster 사용기)에서 나는 TSMaster로 소프트웨어 업데이트 작업 중 진단기 역할을 하도록 UDS를 설정하였다. 진단기 입장에서는 시큐어 플래시는 서명된 소프트웨어를 전달한다는 차이가 있지만 여전히 파일을 전달한다는 입장에서 보면 일반 플래시와 다를 것이 없다. 

     

    다음에는 부트로더에 관해서 설명한다.