<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lapidix</title>
        <link>https://velog.io/</link>
        <description>-</description>
        <lastBuildDate>Tue, 01 Aug 2023 02:14:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>lapidix</title>
            <url>https://images.velog.io/images/moment_log/profile/83a77fd2-8e45-4f9b-a149-4ebbcde279bf/IMG_4131.PNG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. lapidix. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/moment_log" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Self-Sovereign Identity(마스터링 자기주권신원) ]]></title>
            <link>https://velog.io/@moment_log/Self-Sovereign-Identity%EB%A7%88%EC%8A%A4%ED%84%B0%EB%A7%81-%EC%9E%90%EA%B8%B0%EC%A3%BC%EA%B6%8C%EC%8B%A0%EC%9B%90</link>
            <guid>https://velog.io/@moment_log/Self-Sovereign-Identity%EB%A7%88%EC%8A%A4%ED%84%B0%EB%A7%81-%EC%9E%90%EA%B8%B0%EC%A3%BC%EA%B6%8C%EC%8B%A0%EC%9B%90</guid>
            <pubDate>Tue, 01 Aug 2023 02:14:20 GMT</pubDate>
            <description><![CDATA[<h2 id="intro">Intro</h2>
<p><strong>SSI에 대해 맥락을 알아보기 위해 자기주권신원을 읽으며 정리해 보았다!</strong></p>
<hr>
<h2 id="vc-verifiable-credential">VC (Verifiable Credential)</h2>
<h3 id="특징">특징</h3>
<ul>
<li>VC는 변조 감지를 제공하는 발급자가 삽입한 암호화 방식의 proof 속성을 가지고 있기 때문에 발급자에서부터 중간 스토리지 지갑을 통해 검증자에게 이르기까지 보호</li>
<li>VC는 전송 중에 TLS와 같은 암호화된 통신 링크를 통해서만 전송하여 기밀로 보호되어야 한다.</li>
<li>VC는 발급자 또는 다른 제 3자와의 통신이 검증자에게 전송될 필요가 없기 때문에 보유자의 장치에 저장되어 있는 경우 고가용성을 갖는다.</li>
<li>VC는 검증자가 서비스 제공에 필수적인 주체 속성만 요청할 수 있도록 하여 <strong>최소 권한</strong>의 보안 속성을 용이하게 한다.</li>
<li>VC는 영지식 증명(ZKP) VC 또는 원자 VC 집합을 발급하는 밝듭자의 선택적 공개를 통하여 개인정보  보호를 제공하며 이를 통해 보유자는 검증자가 필요로 하는 속성만 공개할 수 있으며, 그 이상은 공개할 필요가 없다.</li>
<li>VC는 신원의 이름이 아닌 가명 ID를 통해 주체를 식별하여 주체의 개인정보를 보호한다. 이러한 가명 ID들이 주체와 검증자 사이에 쌍을 이루어 연결되는 경우에는 전역적으로 고유한 관련성은 생성되지 않는다.</li>
<li>검증자는 서비스에 접근할 수 있는 사용자의 ID가 아니라 서비스에 접근하는 데 필요한 역할이나 속성만 지정하면 되므로 VC는 유연한 역할 기반 및 속성 기반 접근 제어를 지원한다.</li>
</ul>
<h3 id="vc-verifiable-credential-구성-요소">VC (V<strong>erifiable</strong> Credential) 구성 요소</h3>
<ul>
<li><strong>@context</strong> : 해당 VC가 구성하는데 사용된 정보의 집합이며 하나 이사으이 URI시퀀스로 구성</li>
<li><strong>type</strong> : 어떤 속성의 VC인지 설명하는 URI목록이 포함된다.</li>
<li><strong>id</strong> : 발급자가 생성한 VC의 고유한 식별자이며 단일 URI로 구성</li>
<li><strong>issuer</strong> : 발급자를 고유하게 식별하는 URI이며 해당 URI는 발급자의 DID 혹은 DNS의 이름을 포함할 수 있다. 검증 가능한 데이터 저장소는 발급자에 대한 X.509 공개 키 인증서와 같은 추가 세부사항을 포함 가능</li>
<li><strong>credentialSubject</strong> : 발급자가 주체에 대하여 만든 클레임 항목들이며 주체의 ID와 발급자가 주체에 대해 주장하는 속성들의 집합.</li>
<li><strong>proof</strong> : 발급자가 VC를 발급했으며 발급 이후 변조되지 않았음을 암호화 방식으로 증명하는 항목으로, 일반적으로 VC데이터 모델 사항에서 proof로 참조되는 서명이 필요. 해당 항목에 대한 단일 표준은 없으나, 증명의 유형을 나타내는 type항목이 포함되어야 함</li>
<li><strong>issuanceDate</strong> : ISO 8601형식으로 조합되었으며 VC의 발급 시점</li>
<li><strong>credentialStatus</strong>: VC의 현재 상태에 대한 세부 정보이며 표준 형식은 없지만 모든 상태에는 id, type이 포함되어야 함.</li>
<li><strong>refreshService</strong>: 발급자가 현재 VC를 새로 고치거나 업데이트하는 방법에 대한 세부 정보를 제공 및 제어할 수 있으며, 보유자만 알기를 원한다면, VC에 추가하는 방법이 아닌 VC를 캡슐화하는 VP에 추가해야 함.</li>
<li><strong>termsOfUse</strong> : VC에 이용 약관을 추가하는 표준 방법</li>
<li><strong>evidence</strong> : 발급자는 해당 항목을 VC에 추가하여 검증자가 VC의 클레임에 대해 가질 수 있는 신뢰 수준을 결정하는데 도움을 줄 수 있으며 해당 항목은 type이 포함 되어야 함.ㅌㅌ</li>
</ul>
<pre><code class="language-json">//JSON-LD로 인코딩된 VC
{
    &quot;@context&quot;: [
        &quot;https://www.w.org/2018/credentials/Vl&quot;,
        &quot;https://example.org/examples/vI&quot;
        ],
     &quot;id&quot;: &quot;http://example.edu/credentials/3732&quot;,
    &quot;type&quot;: [&#39;VerifiableCredential&quot;, &quot;UniversityDegreeCredential&quot;],
    &quot;issuer&quot;: &quot;https: //example.edu/issuers/14&quot;,
    &quot;issuanceDate&quot;: &quot;2010-01-01719:23:24Z&quot;,
    &quot;credentialSubject&quot;: {
        &quot;id&quot;: &quot;did: example: ebfeb1f712ebc6f1c276e12ec21&quot;,
        &quot;degree&quot;: {
            &quot;type&quot;: &quot;BachelorDegree&quot;,
            &quot;name&quot;: &quot;Bachelor of Science in Mechanical Engineering&quot;
        }, 
        &quot;credentialSchema&quot;: {
            &quot;id&quot;: &quot;https://example.org/examples/degree.json&quot;,
            &quot;type&quot;: &quot;JsonSchemaValidator2018&quot;
        },
        &quot;termsOfUse&quot;: {
            &quot;type&quot;: &quot;IssuerPolicy&quot;,
            &quot;id&quot;: &quot;http: //example.com/policies/credential/4&quot;,
            &quot;profile&quot;: &quot;http://example.com/profiles/credential&quot;,
            &quot;prohibition&quot;: [{
                &quot;assigner&quot;: &quot;https: //example.edu/issuers/14&quot;,
                &quot;assignee&quot;: &quot;AllVerifiers&quot;,
                &quot;target&quot;: &quot;http://example.edu/credentials/3732&quot;,
                &quot;action&quot;: [&quot;Archival&quot;]
            }]
        },
        &quot;evidence&quot;: [{
            &quot;id&quot;: &quot;Ittps://example.edu/evidence/f2aeec97-fcod-42bf-8ca7-0548192d4231&quot;,
            &quot;type&quot;: [&#39;DocumentVerification&quot;],
            &quot;verifier&quot;: &quot;https: / /example.edu/issuers/14&quot;,
            &quot;evidenceDocument&quot;: &quot;DriversLicense&quot;,
            &quot;subjectPresence&quot;: &quot;Physical&quot;,
            &quot;documentPresence&quot;: &quot;Physical&quot;
            }, {
            &quot;id&quot;: &quot;https: //example.edu/evidence/faeec97-fcod-42bf-8ca7-0548192dxyzab&quot;,
            &quot;type&quot;: [&quot;SupportingActivity&quot;],
            &quot;verifier&quot;: &quot;https: //example.edu/issuers/14&quot;
            &quot;evidenceDocument&quot;: &quot;Fluid Dynamics Focus&quot;
            &quot;subjectPresence&quot;: &quot;Digital&quot;
            &quot;documentPresence&quot;: &quot;Digital&quot;
            }], 
        &quot;refreshService&quot;: {
            &quot;id&quot;: &quot;https: //example.edu/refresh/3732&quot;,
            &quot;type&quot;: &quot;ManualRefreshService2018&quot;
            }, 
        &quot;proof&quot;: {
            &quot;type&quot;: &quot;RsaSignature2018&quot;,
            &quot;created&quot;: &quot;2018-06-1821:19:10Z&quot;,
            &quot;verificationMethod&quot;: &quot;https: //example.com/jdoe/keys/1&quot;,
            &quot;nonce&quot;: &quot;cOaelc8e-c7e7-469f-b252-86e6a0e7387e&quot;,
            &quot;signatureValue&quot;: &quot;BavEll0/IlzpYw8XNilbgVg/s...WJT24 = &quot;
    }
}</code></pre>
<h1 id="did-decentralized-identifiers">DID (Decentralized Identifiers)</h1>
<h2 id="개념적-수준-did">개념적 수준: DID</h2>
<p><strong>리소스를 식별하는 문자열인 글로벌 고유 식별자</strong></p>
<p><strong>URL 또는 URN중 어느 하나가 될 수 있으며 DID로 식별되는 리소스에 대한 표준화된 정보인 메타데이터의 집합을 얻기 위해 리졸브할 수 있는 URI</strong></p>
<ul>
<li>URL (Uniform Resource Locator) :인터넷 상의 리소스를 식별하는 데 사용되는 문자열, 일반적으로 웹 페이지, 이미지, 동영상 등의 파일의 위치를 식별하는 데 사용</li>
<li>URN (Uniform Resource Name) : 인터넷 상의 리소스를 고유하게 식별하는 데 사용되는 문자열이며 URN은 일반적으로 파일의 위치를 식별하지 않고, 파일 자체에 대한 식별자로 사용</li>
<li>URI (Uniform Resource Identifier) : 인터넷 상의 리소스를 식별하는 데 사용되는 모든 문자열이며 URI는 URL과 URN을 모두 포함</li>
</ul>
<h3 id="핵심-속성">핵심 속성</h3>
<ul>
<li>영구 식별자 : 변경할 필요가 없음</li>
<li>리졸브 가능한 식별자 : 메타데이터를 찾기 위해 검색 가능</li>
<li>암호로 검증 가능한 식별자 : 암호화를 사용하여 제어를 증명할 수 있음</li>
<li>분산 식별자 : 중앙형 등록 권한이 필요하지 않음</li>
</ul>
<h2 id="기능적-수준--did-작동-방식">기능적 수준 : DID 작동 방식</h2>
<h3 id="did-document">DID Document</h3>
<p><strong>DID를 기본 구성 요소로 사용하는 디지털 지갑, 에이전트 또는 암호화된 데이터 저장소와 같은 디지털 ID 응용 프로그램 또는 서비스에서 사용하도록 설계된 기계 판독 가능 문서</strong></p>
<pre><code class="language-bash">#인증을 위한 하나의 공개 키와 하나의 서비스가 있는 DID Document예시
{
    &quot;@context&quot;: &quot;https: //www.w.org/ns/did/vl&quot;,
    &quot;id&quot;: &quot;did: example: 123456789abcdefghi&quot;,
    &quot;authentication&quot;: [{
        &quot;id&quot;: &quot;did: example: 123456789abcdefghi#keys-1&quot;,
        &quot;type&quot;: &quot;Ed25519VerificationKey2018&quot;
        &quot;controller&quot;: &quot;did: example: 123456789abcdefghi&quot;,
        &quot;publicKeyBase58&quot; : &quot;H3C2AVVLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV&quot;
    }], 
    &quot;service&quot;: [{
        &quot;id&quot;: &quot;did: example: 123456789abcdefghi#vcs&quot;,
        &quot;type&quot;: &quot;VerifiableCredentialService&quot;,
        &quot;serviceEndpoint&quot;: &quot;https://example.com/vc/&quot;
    }]
}</code></pre>
<h3 id="did-메서드">DID 메서드</h3>
<p><strong>DID를 생성하는 데 사용되는 식별자이며 ,DID 생성될 때 사용되는 식별자 및 프로토콜을 정의</strong></p>
<pre><code class="language-bash">#5가지 다른 DID 메서드를 사용하여 생성된 DID
# Sorvin
did:sov:WRfXPg8dantKVubE3HX8pw
# BitCoin
did:btcr:xz35-jzv2-qqs2-9wjt
# VerseOne
did:v1:test:nym: 3AEJTDMSXDDQpyUftjuoeZ2Bazp4Bswjice7FJGybcUu 
# Ethereum
did:ethr:OXE6Fe788d8ca214A080b0f6aC7F48480b2AEfa9a6
# Jolocom
did:J010:11b3523535124865104b4079c04c3666627fcf5a167d69309fc84b75964e2</code></pre>
<h3 id="did-레졸루션">DID 레졸루션</h3>
<p><strong>DID와 관련된 DID Document를 얻는 과정이며 이 과정을 통해 DID지원 응용 프로그램 및 서비스는 DID Document에 표현된 DID 서브젝트에 대한 메타데이터를 검색 가능하며 메타데이터는 다음과 같은 DID서브젝트와의 추가 상호작용에 사용</strong></p>
<ul>
<li>검증 가능한 자격증명 발급자의 디지털 서명을 검증하기 위한 공개 키 조회</li>
<li>컨트롤러가 웹사이트나 앱에 로그인해야할 때 DID 컨트롤러와 관련된 잘 알려진 서비스 검색 및 접근</li>
<li>DID 컨트롤러와 DID간 연결 요청</li>
</ul>
<h3 id="did-url">DID URL</h3>
<p><strong>DID와 관련된 추가 리소스에 대한 식별자 공간을 활성화</strong> </p>
<pre><code class="language-json">did:example:1234#keys-1
// 프레그먼트가 있는 DID URL이며 DID의 관련 DID Document 내에서 특정 공개키를 식별한다.
// 프레그먼트가 있는 http: 또는 https:URL이 HTML 웹페이지 내 특정 책갈피를 가리킬수 있는 방법과 유사

did:example:1234?version-id=4
// DID 매개변수가 있는 DID URL이며 최신 버전이 아닌 DID관련 DID Documnet의 이전 버전을 식별
// DID 문서의 내용이 업데이트 되었지만 특정 버전에 대한 안정적인 참조가 필요한 경우에 유용

did:example:1234?version-id=4#key-1
// 위에 두개의 DID URL을 조합한 것이며 DID관련 DID Document의 특정 이전 버전에내에서 특정 공개키 식별

did:example:1234/my/path?query#fragment
// 경로, 질의 문자열 및 프래그먼트가 있는 DID URL이며, 이 DID URL의 의미 및 처리 규칙은 핵심 DID
// 표준에 의해 정의되지 않고 DID 메서드 및 DID URL을 사용하는 애플리케이션에 따라 정의

did:example:1234?service=hub/my/path?query#fragment
// DID 매개변수가 있는 DID URL이며 DID의 관련 DID Document내에서 특정 서비스를 식별
// 나머지 구문 구성요소의 의미 및 처리 규칙은 핵심 DID 표준에 의해 정의되지 않고 서비스에 한정</code></pre>
<h3 id="dns와-did-비교">DNS와 DID 비교</h3>
<table>
<thead>
<tr>
<th>DID</th>
<th>DNS</th>
</tr>
</thead>
<tbody><tr>
<td>글로벌 유니크</td>
<td>글로벌 유니크</td>
</tr>
<tr>
<td>영구 또는 재할당 가능</td>
<td></td>
</tr>
<tr>
<td>DID 메서드와 DID 컨트롤러에 따라 다름</td>
<td>재할당 가능</td>
</tr>
<tr>
<td>기계 친화적인 식별자</td>
<td></td>
</tr>
<tr>
<td>난수 및 암호화 기반의 긴 문자열</td>
<td>사람 친화적</td>
</tr>
<tr>
<td>적용 가능한 DID메서드에 의해 정의된 다른 메커니즘을 사용하여 리졸브 가능</td>
<td>표준 DNS 프로토콜을 사용하여 리졸브 가능</td>
</tr>
<tr>
<td>관련 데이터는 DID Document로 표현</td>
<td>관련 데이터는 DNS 영역 파일에 표시</td>
</tr>
<tr>
<td>위임 없이 완전히 분산된 네임스페이스</td>
<td>최상위 도메인 이름(TLD)이 있는 중앙형 루트 레지스트리를 기반으로 하는 계층적 위임이 가능한 네임 스페이스</td>
</tr>
<tr>
<td>DID 메서드별 프로세스와 인프라로 보안 암호화 가능</td>
<td>신뢰할 수 있는 루트 레지스트리와 기존 PKI로 보호(DNSSEC)</td>
</tr>
<tr>
<td>DID URL에서 권환 구성 요소로 사용</td>
<td>DNS보안 확장을 사용하여 검증 가능 DNSSEC</td>
</tr>
<tr>
<td>http: 및 https: 웹 주소와 이메일 주소 및 기타 식별자에서 권한 구성 요소로 사용</td>
<td></td>
</tr>
<tr>
<td>DID 메서드별 권환 관리</td>
<td></td>
</tr>
<tr>
<td>DID 메서드는 누구나 생성 가능</td>
<td>국제인터넷주소관리기구(ICANN, Internet Corporation for Assigned Names and Numberes)에서 관리</td>
</tr>
<tr>
<td>DID 컨트롤러의 완전한 제어</td>
<td>각 DNS TLD에 대해 ICANN과 레지스트리 운영자가 궁극적으로 제어</td>
</tr>
</tbody></table>
<h2 id="아키텍쳐-수준--did가-작동하는-이유">아키텍쳐 수준:  DID가 작동하는 이유</h2>
<h3 id="공개-키-기반구조의-핵심-문제">공개 키 기반구조의 핵심 문제</h3>
<p><strong>공개 키 / 비밀 키는 위조될 수 없도록 서로 연결되어 있으나,</strong>  <strong>공개 키를 신뢰하는 당사자들이 실제 컨트롤러와 상호작용하고 있는지 확인할 수 있도록 공개 키를 컨트롤러에 어떻게 강력하게 바인딩 할 것인가</strong>
<img src="https://velog.velcdn.com/images/moment_log/post/3aa689e7-8b31-4efd-8279-f4301212e909/image.png" alt=""></p>
<p>실제로는 컨트롤러에 식별자를 추가하여 공개 키를 컨트롤러에 바인딩을 하는 방법으로 PKI는 사용되고 있다. 그러나 아래와 같은 그림에서 보이듯 문제 지점은 여전히 남아 있다
<img src="https://velog.velcdn.com/images/moment_log/post/509e5e9c-e155-4d8a-b201-f192c91b30b6/image.png" alt=""></p>
<p>문제점은 다음과 같다</p>
<ol>
<li><strong>식별자를 컨트롤러에 어떻게 강력하게 바인딩할 것인가? ⇒ 식별자-컨트롤러 바인딩 문제</strong></li>
<li><strong>공개 키를 식별자에 어떻게 강력하게 바인딩할 것인가? ⇒ 공개 키-식별자 바인딩 문제</strong></li>
</ol>
<h3 id="솔루션1-기존-pki">솔루션1: 기존 PKI</h3>
<ul>
<li><p><strong>식별자-컨트롤러 바인딩 문제</strong></p>
<p>  → <strong><em>가장 적합한 기존 식별자 중 하나를 사용하여 식별자를 컨트롤러에 강력하게 바인딩하는 것</em></strong> </p>
<ul>
<li>문제점<ul>
<li>homographic attack(동형 문자 공격, 유사한 이름 또는 다른 구겢 알파벳의 유사 문자 사용)</li>
<li>DNS 포이즈닝 (DNS서비스에 조작된 쿼리를 전송하여 주소 정보를 변조)</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>공개키-식별자 바인딩 문제</strong></p>
<p>  <strong>→ <em>공개 키와 식별자를 모두 포함하는 문서에 대지털 서명을 하는 암호화를 사용</em></strong></p>
<ul>
<li>문제점<ul>
<li>인증서에 서명을 하는 주체에 대한 중앙화된 인증기관</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="솔루션2-신뢰의-웹-모델">솔루션2: 신뢰의 웹 모델</h3>
<p><strong>기존 PKI의 단점중 하나인 중앙 기관(CA)에 의존하지 않는 P2P 디지털 인증서를 효과적으로 만들 수 있는 솔루션이나, 신뢰할 수 있는 경로를 어떻게 찾을 것인가에 대한 문제에 대해 합리적으로 안전하고 확장 가능하며 채택 가능한 솔루션은 아직 없다.</strong></p>
<h3 id="솔루션3-공개-키-기반-식별자">솔루션3: 공개 키 기반 식별자</h3>
<p><strong>컨트롤러에 대한 기존 식별자를 재사용한 후 공개키에 바인딩하는 대신 프로세스를 역순으로 수행하여 분산원장 또는 유사한 시스템을 이용해 공개 키를 기반으로 컨트롤러에 대한 식별자를 생성하는 방법으로 컨트롤러가 실제 PKI 신뢰 삼각형의 세 지점을 모두 제어할 수 있도록 하는 방법이지만, 컨트롤러의 식별자가 공개 키가 순환될 때마다 변경되는 점으로 인하여 키순환을 지원할 수 없기 때문에 PKI의 대안으로 채택되지 못했다.</strong></p>
<h3 id="솔루션4-did-did-document">솔루션4: DID, DID Document</h3>
<p><strong>공개 키 기반의 솔루션 기반으로, 키순환을 해야할 때 컨트롤러는 업데이트 된 DID Document를 생성하고 이전 개인 키를 이용해 서명한다 이를 통해 키순환 지원 및 중앙기관(CA)에 대한 단점을 개선한다.</strong>
<img src="https://velog.velcdn.com/images/moment_log/post/92767851-6d11-44fb-88a3-83fe21d01cee/image.png" alt=""></p>
<p><strong>PKI를 능가하는 DID 장점</strong></p>
<ul>
<li><strong>후견 및 통제권</strong></li>
<li><strong>서비스 엔드포인트 검색</strong></li>
<li><strong>DID간의 연결 : Diffe-hellman Key Exchange기반 프로토콜을 이용하여 P2P로 직접 교환</strong></li>
</ul>
<pre><code>| Property | Description |
| --- | --- |
| 영구적 | 한 쪽 또는 양쪽 당사자가 원하지 않는 한 연결이 끊어지지 않는다. |
| 비공개적 | 연결을 통한 모든 통신은 자동으로 암호화 되고 DID의 개인 키로 디지털 서명 가능 |
| 종단간(End-to-End) | 연결에 중개자가 없다 |
| 신뢰성 | 연결은 검증 가능한 자격증명 교환을 지원하여 모든 관련 보증 수준에서 더 높은 신뢰를 구축한다. |
| 확장성 | 연결은 DID Comm 프로토콜 또는 두 에이전트가 모두 지원하는 기타 프로토콜을 통해 안전하고 비공개적이며 안정적인 디지털 통신이 필요한 모든 프로그램에서 사용 |</code></pre><ul>
<li><strong>적합한 개인정보보호 중심 설계</strong></li>
</ul>
<h2 id="의미-수준-did가-의미하는-것">의미 수준: DID가 의미하는 것</h2>
<h3 id="주소의-의미">주소의 의미</h3>
<p>주소는 자체적으로 존재하지 않으며 그것들을 사용하는 네트워크의 컨텍스트 안에서만 존재한다. </p>
<h3 id="did-네트워크와-디지털-신뢰-생태계">DID 네트워크와 디지털 신뢰 생태계</h3>
<p>DID는 각 레이어에 다음과 같은 스택이 필수적</p>
<ul>
<li>Layer1: 퍼블릭 DID 유틸리티 : 퍼블릭 블록체인 과 같은 분산 원장 또는 분산파일 시스템에 게시된 DID는 모든 상위 계층의 참가자에 대해 공개적으로 검증 가능한 신뢰 루트역할을 할 수 있기 때문에 신뢰 계층의 기반을 형성</li>
<li>Layer2: DID Comm : DID Comm은 DID로 식별되는 에이전트 간의 P2P 프로토콜이며 Layer2에 존재한다. 그러나 Layer1의 퍼블릭 DID도 사용 가능</li>
<li>Layer3: 자격증명 교환 : DID는 디지털 서명된 검증 가능한 자격증명을 발급 및 검증하는  프로세스와 자격증명 교환 프로토콜에 대한 서비스 엔드포인트 URL 검색에 필수적</li>
<li>Layer4: 디지털 신뢰 생태계 : DID는 모든 규모와 형태 또한 그들이 지정한 참가자들의 디지털 신뢰 생태계를 위한 거버넌스 기관 및 거버넌스 프레임워크의 발견과 검증을 위한 기준점으로 검증 가능한 자격증명이 발급된 거버넌스 프레임워크를 지속적으로 참조하고 거버넌스 프레임워크가 상호 운용성을 위해 서로를 참조할 수 있도록 한다.</li>
</ul>
<h2 id="did-wallet--agent">DID Wallet &amp; Agent</h2>
<h3 id="디지털-지갑">디지털 지갑</h3>
<p>디지털 지갑은 지갑의 컨트롤러가 암호화 key, 기밀 정보 및 기타 민감한 개인 데이터를 생성. 저장, 관리 및 보호할 수 있도록 하는 소프트웨어로 구성</p>
<h3 id="디지털-에이전트">디지털 에이전트</h3>
<p>디지털 에이전트는 디지털 지갑에 있어 컴퓨터나 스마트폰의 운영 체제에 해당한다 개인이 행동을 하고, 통신하며, 정보를 저장하고, 디지털 지갑의 사용을 추적할 수 있게 해주는 소프트웨어</p>
<h2 id="dpki-decentralized-public-key-infrastructure">DPKI (Decentralized Public Key Infrastructure)</h2>
<h3 id="keri-key-event-receipt-infrastructure">KERI (Key Event Receipt Infrastructure)</h3>
<p><strong>거래의 유효성을 검증하고 거래가 일어날 때마다 거래 내용을 기록하여 거래 내용의 무결성과 불변성을 보장하기 위한 기술</strong></p>
<h3 id="키-관리-아키텍처의-출발점-신뢰-루트">키 관리 아키텍처의 출발점: 신뢰 루트</h3>
<p><strong>키 관리 아키텍처가 중앙형, 연합형, 분산형이든 상관없이 모두 신뢰 루트에서 시작</strong></p>
<aside>
👉🏻 **신뢰 루트(신뢰 앵커)** : 신뢰가 파생될 필요가 없는 체인의 유일한 지점이기 때문에 신뢰체인의 시작점이며 신뢰 루트의 신뢰는 가정된다.

</aside>

<ul>
<li><strong>관리 기반 신뢰 루트(administrative roots of trust)</strong> : 기존 PKI에서 사용되는 신뢰 루트이며 발급하는 디지털 인증서의 무결성을 보장하기 위해 엄격한 절차를 따르는 사람으로 구성된 인증기관(CA)를 의미</li>
<li><strong>알고리즘 기반 신뢰 루트(algorithmic root trust)</strong> : 트랜잭션 기반 신뢰 루트(transactional roots of trust)라고도 하며 단일 당사자가 제어할 수 없지만 모든 당사자가 공유된 신뢰의 근원에 동의할 수 있는 보안시스템을 생성하도록 설계된 컴퓨터 알고리즘을 기반 신뢰 루트를 의미</li>
<li><strong>자체 인증 신뢰 루트</strong> : 지율 신뢰 루트라고도 하며, 보안 난수 생성 및 암호화에 기반한 신뢰 루트를 의미. SSI의 경우 디지털 지갑만으로 생성할 수 있는 DID를 의미한다.</li>
</ul>
<table>
<thead>
<tr>
<th></th>
<th>관리 기반 신뢰 루트</th>
<th>알고리즘 기반 신뢰 루트</th>
<th>자체 인증 신뢰 루트</th>
</tr>
</thead>
<tbody><tr>
<td>중앙화 / 단일 장애 지점</td>
<td>O</td>
<td>X</td>
<td>X</td>
</tr>
<tr>
<td>검증에 사람의 개입 필요</td>
<td>O</td>
<td>X</td>
<td>X</td>
</tr>
<tr>
<td>외부 당사자의 참여 필요</td>
<td>O</td>
<td>O</td>
<td>X</td>
</tr>
</tbody></table>
<h3 id="dkms-decentralized-key-management-system">DKMS (Decentralized Key Management System)</h3>
<p>DKMS란 분산 키 관리 시스템을 의미.  중앙형 권한이 없는 블록체인 및 DLT(분산원장기술)과 함께사용하기 위한 암호화 키 관리 시스템이며 기존 PKI(Public Key Infrasturcture)아키텍처의 핵심가정인 공개 키 인증서가 중앙형 또는 연합형 인증 기관인 CA에서 발급될 것이라는 가정을 없앤다.</p>
<p><strong>DKMS의 장점</strong> </p>
<ul>
<li><strong>단일 실패 지점 없음</strong> : 알고리즘 또는 자체 인증 신뢰루트를 사용하므로 중앙CA 혹은 기타 등록 기관에 의존하지 않는다</li>
<li><strong>상호 운용성</strong> : 두 명의 ID 소유자와 해당 애플리케이션이 독점 소프트웨어, 서비스 제공업체 또는 연합에 의존하지 않고 키 교환을 수행 및 암호화된 P2P연결을 생성 가능하다.</li>
<li><strong>이식성</strong> : 사용자는 DKMS호환 지갑, 에이전트 또는 에이전시의 특정 구현에 종속되는 것을 피할 수 있다.</li>
<li><strong>키 복구</strong> : DKMS를 이용하면 에이전트 자동 암호화 백업, DKMS 키 에스크로 서비스 및 키의 소셜 복구를 포함한 강력한 기 복구가 인프라에 직접 구축되어야 한다.</li>
</ul>
<p><strong>DKMS가 해결해야할 문제</strong> </p>
<ul>
<li><em>키를 교체할 수 있는 외부 기관이 있는 경우 해당 기관에사 항상 사용자의 키를 빼앗거나 해당 시스템이 손상되어 키에 침입할 수 있다. 그래서 DKMS에는 “비밀번호 재설정” 옵션이란 없으며 DKMS는 처음부터 키 보유자를 위해 안전장치로 설계되어야 한다.</em></li>
<li><em>DKMS는 SSI의 기초가 된 W3C 검증 가능한 자격증명 및 분산 식별자 표준과 같이 모든 오픈 소스 프로젝트 또는 상용 공급업체가 구현할 수 있는 공개 표준을 기반으로 해야한다 이는 Apple iMessage등과 같이 인기 있는 보안 메신저의 접근 방식을 제거한다.</em></li>
<li><em>DKMS는 암호화 알고리즘 및 프로토콜의 진화적 발전을 수용할 수 있어야 한다.</em></li>
<li><em>DKMS는 최종 사용자를 대신하여 전문 지식이나 기술을 가정할 수 없다. 최신 브라우저 및 이메일 클라이언트만큼 사용하기 쉬어야 하며, 무엇보다도 최종 사용자에게 암호화, 블록체인, SSI 또는 공개키/개인키에 개념과 이해를 요구할 수 없다.</em></li>
</ul>
<aside>
❓ **BlockChain과 DLT 차이**

<ul>
<li>블록체인은 신뢰가 없거나 비허가형 시스템으로 중앙화된 기관의 허가 없이 새로운 참여자에게 더 개방적</li>
<li>DLT는 신뢰 기반 또는 허가형 시스템으로, 미래의 불특정 참여자가 가입하기 위해서는 일반적으로 허가를 받아야 한다.</aside>

</li>
</ul>
<h2 id="자기-주권-신원의-10가지-원칙">자기 주권 신원의 10가지 원칙</h2>
<ol>
<li><p><strong>존재: 사용자들은 독립적인 존재여야 한다.</strong> </p>
<p> 어떤 자기주권신원은 궁극적으로 신원의 중심에 있으면서 형언할 수 없는 ‘나’를 기초로한다. 그것은 결코 완전한 디지털 형태로 존재할 수 없으며 이 것은 유지되고 지원되는 자체 커널이어야 한다. 자기주권신원은 단순하게 이미 존재하는 ‘나’의 제한된 일부의 측면을 공개하고 접근 가능하게 한다.</p>
</li>
<li><p><strong>통제: 사용자들은 자신의 신원을 통제해야 한다.</strong></p>
<p> 신원과 신원의 클레임의 지속적인 유효성을 보장하는 잘 이해되고 안전한 알고리즘에 따라 사용자는 자신의 신원에 대하여 기본적으로 권한이 있다. 사용자는 항상 참조하거나 업데이트하거나 숨길 수 있어야한다. 사용자는 자신이 원하는 대로 가시적이고, 명성이 있으며 개인정보보호 수준을 선택할 수 있어야하며 사용자가 자신의 신원에 대한 모든 클레임을 제어할 수 있다는 것을 의미하지는 않는다. 다른 사용자가 사용자에 대해 클레임을 제기할 수는 있지만 신원 자체에 중심을 두어서는 안 된다. </p>
</li>
<li><p><strong>접근: 사용자는 자신의 데이터에 접근할 수 있어야 한다.</strong></p>
<p> 사용자는 항상 자신의 신원에 있는 모든 클레임 및 데이터를 쉽게 검색할 수 있어야 하며, 자신의 데이터가 가려지거나 숨기는 주체가 없어야 한다. 이것이 사용자가 신원과 돤련된 모든 클레임을 수정할 수 있다는 것을 뜻하지는 않지만, 사용자가 클레임을 알고 있어야 한다는 것을 의미한다. 또한 사용자가 다른 사용자의 데이터에 접근할 수 있는 것이 아니라 자신의 데이터에만 접근할 수 있다는 것을 의미한다.</p>
</li>
<li><p><strong>투명성: 시스템과 알고리즘은 투명해야 한다.</strong></p>
<p> 신원 네트워크를 관리하고 운영하는 데 사용되는 시스템은 신원의 작동 방식, 관리 및 업데이트 방식 모두에서 공개되어야 한다. 알고리즘은 자유롭고 오픈소스이며, 널리 알려져 있으면서, 특정 아키텍처에서 가능한 독립적이여야 하며, 누구나 작동 방식을 검사할 수 있어야 한다.</p>
</li>
<li><p><strong>지속성: 신원은 오래 지속되어야 한다.</strong></p>
<p> 가급적 신원은 영구적 또는 사용자가 원하는 만큼 지속되어야 한다. 개인키를 순환하고 데이터를 변경해야 할 수 있지만 신원은 그대로 유지된다. 빠르게 변화하는 인터넷 세상에서, 이러한 목표는 완전히 합리적이지 않을 수 있으므로, 최소한 신원은 새로운 시원 시스템에 의해 시대에 뒤떨어지기 전까지 지속되어야 한다. 이는 ‘잊혀질 권리’에 위배 되는 것이 아니라, 사용자가 원할 경우 사용자가 신원을 처리할 수 있어야 하며, 클레임은 시간이 지남에 따라 적절히 수정되거나 삭제되어야 한다. 이를 위해서 신원과 신원의 클레임 사이에 확실한 분리가 필요하며 영구적으로 묶여 있을 수 없다.</p>
</li>
<li><p><strong>이식성: 신원에 대한 정보와 서비스는 전송할 수 있어야 한다</strong></p>
<p> 사용자에게 가장 이익이 될 것으로 예상되는 신뢰 가능한 개체인 경우에도 단일한 제 3자가 신원을 보유해서는 안된다. 문제는 그 개체가 사라질 수 있고, 인터넷에서는 대부분 그럴 수 있다는 것이다. 제도는 바뀔 수 있고 사용자는 다른 관할권으로 이동할 수 있기 때문. 전송가능한 신원은 사용자가 어떤 일이 있어도 자신의 신원을 제어할 수 있도록 보장하며 시간이 지남에 따라 신원의 지속성을 향상시킬 수 있다.</p>
</li>
<li><p><strong>상호 운용성: 신원은 가능한 널리 사용할 수 있어야 한다.</strong></p>
<p> 제한된 곳에서만 작동하는 신원은 가치가 거의 없다. 21세기 디지털 신원 시스템의 목표는 신원 정보를 널리 사용 가능하게 하여 사용자의 통제력을 잃지 않고 국제적 신원을 만드는 것이며 지속성과 자율성 덕분에, 이러한 널리 이용 가능한 신원들은 지속적으로 이용할 수 있다. </p>
</li>
<li><p><strong>동의: 신원을 사용함에 동의해야 한다.</strong></p>
<p> 모든 신원 시스템은 신원과 신원의 클레임을 고유하기 위해 구축되며 상호 운용 가능한 시스템은 공유를 확대한다. 그러나 데이터 공유는 사용자의 동의가 있어야만 가능하다. 고용주, 신용정보 기관 또는 친구와 같은 다른 사용자가 클레임을 요청할 수 있지만, 사용자는 클레임이 유효하도록 동의를 해야 한다. 이 동의는 상호작용방식의 동의가 아닐 수 있지만, 신중하고 잘 이해되는 방식이어야 한다. </p>
</li>
<li><p><strong>최소화: 클레임의 공개를 최소화해야 한다.</strong></p>
<p> 데이터가 공개될 때 해당 공개에는 당연한 작업을 수행하는데 필요한 최소한의 데이터가 포함되어야 한다. 예를 들어, 최소한의 연령만 요구하는 경우 정확한 나이를 공개하지 않으면서 연령대만 공개하고 생년월일은 공개하지 않아야 한다. 이 원칙은 선택적 공개, 범위 증명 및 기타 영지식 기술로 뒷받침할 수 있지만, 비상관성은 여전히 매우 어려운 작업이다. 우리가 할 수 있는 최선은 최소화를 사용하여 개인정보보호를 최대한으로 지원하는 것.</p>
</li>
<li><p><strong>보호: 사용자의 권리는 보호되어야 한다.</strong></p>
<p>신원 네트워크의 요구와 개별 사용자의 권리 사이에 충돌이 있을 때 네트워크는 네트워크의 요구보다 개인의 자유와 권리를 보호하는 측면에서 오류를 범해야 한다. 이를 보장하기 위해 신원 인증은 검열 저항성이 있고, 강제 복원력이 있으며 분산 방식으로 실행되는 독립적인 알고리즘을 통해 수행되어야 한다.</p>
</li>
</ol>
<h2 id="ssi의-원칙">SSI의 원칙</h2>
<ol>
<li><strong>표현</strong> : SSI 생태계는 어떠한 개체(인간적, 법적, 자연적, 물리적 또는 디지털적 실체)라도 디지털 신원을 통해 표현될 수 있도록 수단을 제공해야 한다.</li>
<li><strong>상호 운용성</strong>: SSI 생태계는 로열티가 없는 공개 표준을 사용함으로써 각각의 개체를 위한 디지털 신원 데이터가 상호운용적으로 표현, 교환, 보호되도록 해야 한다</li>
<li><strong>분산화</strong>: SSI 생태계는 개체의 디지털 신원 데이터를 표현, 통제, 검증하는데 있어 중앙형 시스템이 요구되지 않도록 해야 한다.</li>
<li><strong>통제 및 대리</strong>: SSI생태계는 자신의 신원과 관련된 자연적, 인간적, 법적 권리를 가진 개체(신원권리 보유자)가 자신의 디지털 신원을 사용할 수 있는 통제권을 제공하고, 또한 자신이 선택한 대리자 혹은 보호자에게 그 권한을 위임함으로써 이러한 통제권을 행사할 수 있는 권리 역시 제공해야 한다. 이러한 위임의 대상은 개인, 조직, 기기 그리고 소프트웨어를 포함한다.</li>
<li><strong>참여</strong>: SSI생태계는 신원 권리 보유자의 참여가 요구되지 않도록 해야 한다.</li>
<li><strong>형평성과 포용</strong>: SSI생태계는 신원 권리 보유자가 그 거버넌스 구조 내에서 배제되거나 소외되지 않도록 해야 한다.</li>
<li><strong>사용성, 접근성 및 일관성</strong> : SSI 생태계는 신원 권리 보유자가 에이전트 및 기타 SSI 구성요소에 대한 사용성, 접근성 그리고 사용자 경험의 일관성 측면이 극대화될 수 있도록 해야 한다.</li>
<li><strong>이식성</strong>: SSI 생태계는 신원 권리 보유자가 자신의 디지털 신원 데이터 사본을 에이전트나 자신이 선택한 시스템으로 이동 또는 전송할 수 있는 가능성을 제한하지 않아야 한다.</li>
<li><strong>보안</strong>: SSI 생태계는 신원 권리 보유자가 안전하게 자신의 디지털 신원 데이터를 보호하고, 자신의 식별자와 암호화 키를 관리할 수 있으며, 모든 상호작용에 대해 종단 간 암호화가 적용될 수 있는 환경을 제공해야 한다. </li>
<li><strong>검증 가능성 및 진위성</strong>: SSI 생태계는 신원 권리 보유자가 자신의 디지털 신원 데이터에 대한 진위성을 검증할 수 있는 증거를 제공할 수 있도록 해야 한다.</li>
<li><strong>프라이버시 및 최소한의 공개</strong>: SSI 생태계는 신원 권리 보유자가 자신의 디지털 신원 데이터에 대한 프라이버시를 보호할 수 있도록 하고, 특정 상호작용에 대해 요구되는 최소한의 디지털 신원 데이터를 공유할 수 있도록 해야 한다.</li>
<li><strong>투명성</strong>: SSI 생태계는 신원 권리 보유자 및 다른 이해 관계자들이 SSI 생태계의 에이전트 및 기타 구성요소가 작동하는 인센티브, 규칙, 정책 및 알고리즘을 이해하는 데 필요한 정보에 쉽게 접근하고 검증할 수 있어야 한다.</li>
</ol>
<h2 id="이더리움-블록체인-생태계에서의-신원">이더리움 블록체인 생태계에서의 신원</h2>
<p><strong><code>ERC 725</code>와 <code>ERC 1056</code>은 서로 다른 기능을 하는 자기주권신원에 대한 두 가지 접근 방식이다. <code>ERC 725</code>는 이더리움 계정을 공개된 온체인 신원으로 만드는 데  중점을 두고 있으며, 여기에는 정보를 얼마든지 추가할 수 있다. 이것은 주로 블록체인에 활성화 되고 다른 블록체인의 첨여자들과 성호 작용하기 위한 것이다. 이와 대조적으로 <code>ERC 1056</code>은 모든 신원 정보를 오프체인으로 유지한다. 온체인 스마트 컨트랙트는 해당 신원에 대한 공개 키 레지스트리 역할을 한다. 이더리움에서 작업을 수행하는 다른 방법은 항상 존재하기 때문에 더 많은 방법이 있을 수 있다</strong></p>
<h2 id="outro">Outro</h2>
<p><strong>사실 DID에 관련된 지식을 찾기 어려웠는데 책을 읽으며 대략적인 맥락을 잡아가는데 많은 도움이 되었습니다 !</strong></p>
<p><strong>또한 책의 후반부에 Indy-SDK에 대한 실습 코드역시도 Indy SDK에 대한 이해도를 높이는데 많은 도움이 되었습니다!</strong></p>
<p><em><del>(많은 에러가 동반했지만...)</del></em></p>
<p><strong>SSI에 대해 입문하기 위한 서적으로는 정말 강추드립니다!!</strong> ☻☻</p>
<hr>
<p><strong>Refer.</strong>
알렉스 프록샤트 , 드러먼드 리드 저자(글) · 정상효 , 이민호 번역 </p>
<ul>
<li><strong>알렉스 프록샤트,드러먼드 리드 , 『마스터링 자기주권 신원』 , 정상효,이민호, 제이펍(2022)</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] Ethereum]]></title>
            <link>https://velog.io/@moment_log/Cryptography-Ethereum</link>
            <guid>https://velog.io/@moment_log/Cryptography-Ethereum</guid>
            <pubDate>Fri, 03 Jun 2022 16:11:07 GMT</pubDate>
            <description><![CDATA[<h2 id="ethereum">Ethereum</h2>
<p><strong><em>Vitalik Buterin이 2013년에 제안한 BlockChain 시스템이며 Bitcoin을 확장했다고 볼 수 있다. 대표적인 특징으로 EVM(Ethereum Virtual Machine)과 Smart Contract 등이 있다.</em></strong></p>
<h3 id="ethereum의-특징">Ethereum의 특징</h3>
<ul>
<li><p>한 블록의 평균 크기는 <strong>2KB</strong></p>
</li>
<li><p><strong>EVM</strong>을 통해 <strong>Smart Contract</strong>실행이 가능
↪<em>Smart Contract는 <strong>Turing Complete</strong>하다고 표현된다.</em></p>
</li>
<li><p>BitCoin은 총 발행량이 2,100만개로 반감기가 있지만 이더리움은 정해진 <strong>총 발행량이 없다</strong>.</p>
</li>
<li><p>Bitcoin은 Longest Chain을 선택하는 프로토콜을 사용하지만 <strong>Ehereum은 Heaviest Chain을 선택하는 프로토콜을 사용</strong>한다.
↪ <em>Bitcoin은 height가 제일 높은 Chain을 선택하지만, Etereum같은 경우는 <strong>Subtree</strong>가 많은 체인을 선택한다.</em></p>
</li>
<li><p>Uncle Block을 채굴한 Miner에게도 어느정도 보상을 제공한다
↪ _<strong>Uncle Block</strong>이란 Bitcoin에서 Orphan Block과 메인 네트워크에 영향을 주지 않는다는 점은 비슷하다. _🥲</p>
</li>
</ul>
<hr>
<h2 id="account">Account</h2>
<h3 id="eoaexternally-owned-accounts">EOA(Externally owned accounts)</h3>
<p><strong><em>Private Key를 통해 사용하며 새로운 transaction을 생성할 수 있다.</em></strong></p>
<h3 id="cacontract-accounts">CA(Contract accounts)</h3>
<p><strong><em>Contract Code를 통해 사용하며 CA는 스스로 새로운 transaction을 생성할 수 없다</em></strong></p>
<h3 id="account-state">Account State</h3>
<ul>
<li><strong>nonce</strong> : <em><strong>EOA</strong>에서의 <code>nonce</code>는 EOA에서 Tx를 생성할 때 마다 증가하며, <strong>CA</strong>에서의 <code>nonce</code>는 account에 의해 Contract가 생성될 때 마다 증가한다</em></li>
<li><strong>balance</strong> : _해당 주소의 소유 <code>Wei</code>의 총 합 _</li>
<li><strong>storageRoot</strong> : <em><strong>Storage trie</strong>의 Root Node를 hashing한 값</em></li>
<li><strong>codeHash</strong> : <em><strong>CA</strong>에서의 <code>codeHash</code>는 EVM을 통해 만들어진 hash값이며 <strong>EOA</strong>에서는 빈 문자열을 hashing한 값이다</em></li>
</ul>
<hr>
<h2 id="trie">Trie</h2>
<p><strong><em>이더리움에서 트리는 <a href="https://velog.io/@moment_log/Cryptography-Merkle-Patricia-Trie-MPT">Merkle Patricia Trie</a>를 이용하며 모든 block의 header에는 <code>State Trie</code>, <code>Transaction Trie</code>, <code>Recipts Trie</code>의 root값이 존재한다</em></strong></p>
<ul>
<li><p><strong>State Trie</strong> : <em>위에서 알아본 Account State들이 주로 저장된다.</em>
↪ <em><code>key</code>값은 account 값이고 <code>value</code>값은 accout의 state로 [nonce, ..., storageRoot]값으로 구성되어 있다.</em></p>
</li>
<li><p><strong>Transaction Trie</strong> : <em>각각의 block으로부터 구분되어 있으며 block이 mining된 이후엔 update되지 않는다.</em>
↪ <em><code>key</code>값은 block내에서 transaction의 index값이며 <code>value</code>값은 nonce, gas price 등으로 구성되어 있다</em></p>
</li>
<li><p><strong>Recipts Trie</strong> : <em>transaction의 결과에 대해 저장하며 transaction의 영수증과 같은 역할을 한다 _
↪ _<code>key</code>값은 <strong><code>Transaction Trie</code></strong>와 같이 block내에서 transaction의 index값이며 <code>value</code>값은 gas used, post-trx state 등으로 구성되어 있다</em></p>
</li>
<li><p>Storage Trie : <em>Contract상의 유지되는 데이터 등이 저장된다</em></p>
</li>
</ul>
<hr>
<h2 id="fee">Fee</h2>
<p><strong><em>Ethereum에서는 transaction의 gas fee와 storage fee를 이용하여 반복문의 무한반복, 네트워크 공격 등에 대한 문제를 대비했다.</em></strong></p>
<h3 id="gas--gas-limit">Gas &amp; Gas limit</h3>
<ul>
<li><p><strong>Gas</strong> : <em>Transaction을 실행하기 위한 <code>fee</code></em></p>
</li>
<li><p><strong>Gas Price</strong> : <em>Transaction을 위해 사용할 Gas의 단위</em></p>
</li>
<li><p><strong>Gas limit</strong> : <em>Transaction을 위해 사용할 최대 Gas량을 의미하며 Transaction실행 후 잔액은 반환</em></p>
</li>
<li><p><strong>Max transaction fee</strong> : <em>Transaction실행을 위해 사용할 Gas와 Gas limit을 곱한 값으로  Transaction실행 후 잔액은 반환</em></p>
</li>
</ul>
<blockquote>
<p><strong><em>✏️ Max transaction fee <code>0.001 eth</code> = Gas Price <code>20gwei</code> × Gas limit <code>50,000</code></em></strong></p>
</blockquote>
<h3 id="storage-fee">Storage fee</h3>
<p><strong><em>사용한 Storage 만큼의 fee가 사용되며 최소 32byte에 비례해서 fee가 사용된다.</em></strong></p>
<blockquote>
<p><strong><em>Contract를 이용해 사용한 storage를 초기화 한다면 일부 gas fee를 반환받을 수 있다.
자세한 내용은 <a href="https://ethereum.github.io/yellowpaper/paper.pdf">이더리움 황서</a>에서 <code>Appendix G</code>부분에서 확인 가능하다</em></strong></p>
</blockquote>
<hr>
<h2 id="transaction--messages">Transaction &amp; Messages</h2>
<p><strong><em>이더리움에서는 Transaction뿐만 아니라 Internal Transaction(Messages)으로 구분되는 Transaction이 있다</em></strong></p>
<h3 id="transaction">Transaction</h3>
<p><strong><em>Transaction의 구성 요소</em></strong></p>
<ul>
<li><p><strong>nonce</strong> : _sender가 보낸 Transacion의 counting된 수 _</p>
</li>
<li><p><strong>gas Price</strong> : <em>Transaction을 위해 사용할 Gas의 단위</em></p>
</li>
<li><p><strong>gas Limit</strong> : <em>Transaction을 위해 사용할 최대 Gas량을 의미하며 Transaction실행 후 잔액은 반환</em></p>
</li>
<li><p><strong>to</strong> : <em>Transaction을 받는 주소</em></p>
</li>
<li><p><strong>value</strong> : <em>보내는 <code>Eth</code>, 혹은 <code>Wei</code>의 양</em>
↪ ✏️ <strong><em>Contract를 생성하는 Transaction에도 사용가능하며 이 경우, Contract의 최초 셋팅 balance이다</em></strong></p>
</li>
<li><p><strong>v, r, s</strong> : <em>서명한 sender를 식별할 수 있는 요소</em></p>
</li>
<li><p><strong>init</strong> : _Contract를 생성하는 Transaction에만 존재하며 최초의 Contract의 셋팅값을 포함해 CA를 초기화하며 이후 byte code를 리턴한다 _</p>
</li>
<li><p><strong>data</strong> : <em>message call에만 존재하는 optional Field이며 parameter등이 들어간다.</em></p>
</li>
</ul>
<blockquote>
<p>🤔 <strong><em>Transaction을 검증 하기 위해서 누가 보낸 Transaction인지를 알아야 하지만 from항목이 없다.
이더리움 Transaction에서는 from 대신 <code>v</code>, <code>r</code>, <code>s</code>라는 요소를 넣어 검증을 하는데 <code>v</code>, <code>r</code>, <code>s</code>는 각각 ECDSA에 의해 생성된 전자 서명 <code>r</code>, <code>s</code>와 어떤 공개키인지를 추측할 수 있는 <code>v</code>로 구성되어 있다.
↪ ECDSA를 검증하는 자세한 과정은 <a href="https://cryptobook.nakov.com/digital-signatures/ecdsa-sign-verify-examples">여기</a>에서 찾아보자.</em></strong></p>
</blockquote>
<h3 id="internal-transaction-messages">Internal Transaction (Messages)</h3>
<p><strong><em>Internal Transaction은 Contract에 의해 호출된 Transaction을 의미한다</em></strong></p>
<blockquote>
<p>🧐 <strong><em>Internal Transaction에서 연산 등을 위한 gas는 최초의 실행시킨 EOA가 지불한다.</em></strong></p>
</blockquote>
<h3 id="execution">Execution</h3>
<p><strong>_ 모든 Transaction 실행 조건_</strong></p>
<ul>
<li><p>RLP 포멧으로 셋팅</p>
</li>
<li><p>Transaction의 Signature 검증</p>
</li>
<li><p>Transaction의 nonce와 sender account의 nonce와 같은지 확인</p>
</li>
<li><p>Transaction의 gas Limit이 기본적으로 사용되는 gas들의 합보다 많은지 확인
↪<em>Transaction을 실행하기 위해 필요한 기본 21,000gas를 포함해 사용할 Storage fee 등을 계산한다</em></p>
</li>
<li><p>sender의 account에 있는 balance가 지불할 금액보다 많은지 확인</p>
</li>
</ul>
<blockquote>
<p><strong>𖤐</strong> <strong><em>Transaction의 Storage fee는 <code>4 * X + 68 * Y</code>로 계산한다.
↪ X는 byte code로 변경했을 때 0인 값이고, Y는 0이 아닌 다른 수인 값이다.</em></strong></p>
</blockquote>
<p><strong>𖤐</strong> <strong><em>조건이 확인되면 Transaction은 아래와 같은 순서로 실행된다</em></strong></p>
<p>** 1. sender의 balance에서 지불할 금액과 Gas를 제한다 **</p>
<p>** 2. sender의 account nonce의 값에 1을 더한다**</p>
<p>** 3. subState을 추척한다 **
↪ <em>Transaction을 실행시키는 중에 trie에 직접 접근할 수 없으니 trie에서 필요한 데이터를 불러와 임시로 저장하는 subState를 사용한다.</em></p>
<p>** 4. 필요한 여러가지 연산을 한 후 refund amount를 계산하여 sender에게 반환한다. **
↪ <em><code>refund amount</code>는 사용하지 않은 gas(<code>unused gas</code>) + 사용하던 storage 초기화하여 받는 refund(<code>refund of clearing up storage</code>)로 계산한다</em></p>
<p>** 5. 반환받지 않은 gas는 Miner에게 지급되며 이를 위해 Block에 <code>gas counter</code>에 더한다**</p>
<p><strong>6. Transaction이 종료되며 subState에 있는 지워질 account들은 삭제한다</strong>
↪<em>삭제라는 표현을 사용했지만 실제로 삭제가 아닌 Account State에서 nonce와 balance는 0으로, storageRoot는 NULL값, codeHash는 빈 문자열을 hashing한 값을 넣어 초기화 한다</em></p>
<blockquote>
<p><strong><em>subState에는 <code>Self-destruct set</code>, <code>Log series</code>, <code>Refund balance</code>가 있다.</em></strong></p>
</blockquote>
<ul>
<li><strong>Self-destruct set</strong> : <em>Transaction 실행 후 삭제될 amount의 리스트</em></li>
<li><strong>Log series</strong> : <em>log 리스트</em></li>
<li><strong>Refund balance</strong> : <em>sender가 반환받을 금액</em></li>
</ul>
<hr>
<h2 id="block">Block</h2>
<p><strong><em>이더리움의 Block은 <code>BlockHeader</code>, <code>Transaction의 정보</code>, <code>ommer Block의 header</code> 등으로 구성되어 있다</em></strong></p>
<h3 id="block-header">Block Header</h3>
<p><strong><em>Block Header의 구성 요소</em></strong></p>
<ul>
<li><p>*<em>parentHash *</em> : <em>previous Hsah를 의미하며 이전 블록의 주소값</em></p>
</li>
<li><p><strong>uncleHash</strong> : <em>현재 블록의 uncle block 리스트</em></p>
</li>
<li><p><strong>beneficiary</strong> : <em>Miner의 주소</em></p>
</li>
<li><p>*<em>stateRoot *</em> : <em>state trie의 root Node를 hashing한 값</em></p>
</li>
<li><p>*<em>transactionRoot *</em> : <em>transaction trie의 root Node를 hashing한 값</em></p>
</li>
<li><p>*<em>reciptseRoot *</em> : <em>recipts trie의 root Node를 hashing한 값</em></p>
</li>
<li><p><strong>logsBloom</strong> : <em>log 정보를 담은 Bloom filter</em></p>
</li>
<li><p><strong>difficulty</strong> : <em>해당 블록의 난이도</em></p>
</li>
<li><p><strong>number</strong> : <em>현재 블록의 번호</em></p>
</li>
<li><p><strong>gasLimit</strong> : <em>블록에 포함된 Transaction들의 총 Gas Limit 값</em></p>
</li>
<li><p><strong>gasUsed</strong> : <em>블록에 포함된 Transaction들에서 사용한 총 Gas 값</em></p>
</li>
<li><p><strong>timestamp</strong> : _현재 블록 생성시간을 Unix timeStamp로 _</p>
</li>
<li><p><strong>extraData</strong> : <em>Block의 여유 공간</em></p>
</li>
<li><p><strong>mixHash</strong> : <em>이더리움의 PoW 알고리즘 Ethash의 mixing된 값을 저장</em></p>
</li>
<li><p><strong>nonce</strong> : <em>이더리움의 PoW 알고리즘 Ethash에서 사용하는 값</em></p>
</li>
</ul>
<h3 id="uncle-ommer-stale-block">Uncle (Ommer, Stale) Block</h3>
<p><strong><em>fork된 Block으로 메인 네트워크에는 영향을 주지 못하는 Block</em></strong></p>
<ul>
<li><p><em>메인 네트워크에 존재하는 Block은 Stale Block을 Uncle Block으로 제안할 수 있다.</em>
↪<em>Uncle Block을 제안할 수 있는 최대 갯수는 2개이며 검증을 통해 진행되고 Uncle Block으로 확정되면 블록 체굴보상의 1/32를 보상받는다</em></p>
</li>
<li><p><em>Uncle Block을 Mining한 Miner도 보상을 받는다.</em>
↪ <strong>Uncle Block Mining Reward</strong> = $( (U_n + 8 - B_n) / 8)$ × <em>기존의 채굴 보상</em>
↪$U_n$ : Uncle Block의 nonce , $B_n$ : 현재 Block의 nonce</p>
<blockquote>
<p>✏️ <strong><em>현재 Block의 nonce와 Uncle Block의 nonce가 같을 경우 기존의 채굴 보상을 받는 것이 이닌 fork로 처리 되어 어떤 체인을 선택하느냐로 나뉘기 때문에 Uncle Block Mining Reward는 없다</em></strong></p>
</blockquote>
</li>
</ul>
<h2 id="evm--contact">EVM &amp; Contact</h2>
<h3 id="contract">Contract</h3>
<p><strong><em>solidity를 이용한 어떤 상태를 다른 상태로 변환 시킬수 있는 기능을 포함한 계약을 위한 스크립트 언어로 작성된 프로그램</em></strong></p>
<p><strong>_Contract 생성시 초기화 _</strong></p>
<ul>
<li><p><em>nonce는 0으로 설정한다.</em></p>
</li>
<li><p><em>Contract를 생성하는 Transaction에 value값이 있다면 value값을 넣어 balance를 설정하고 sender의 balance에서 제한다.</em></p>
</li>
</ul>
<ul>
<li><em>storage는 null값을 넣고, codeHash에는 빈 문자열을 hashing한 값을 넣어 설정한다.</em></li>
</ul>
<blockquote>
<p>📌 <strong><em>최초의 생성시 <a href="https://ethereum.github.io/yellowpaper/paper.pdf">이더리움 황서</a>에 나와있는 Gas비가 사용되며 사용하는 Storage용량에 비례하여 추가로 더 Gas를 사용한다.
𖤐만약 가스비가 모자른 상황(<code>out-of-gas</code>)이 발생할 경우 상태는 Transaction이 실행되기 전으로 돌아가지만 sender는 Gas를 반환받을 수 없다.</em></strong></p>
</blockquote>
<h3 id="ethereum-virtual-machine-evm">Ethereum Virtual Machine (EVM)</h3>
<p><strong><em>EVM을 통해 모든 Node들은 Contract를 실행할 수 있으며 32bytes 스택기반의 아키텍쳐이다.</em></strong></p>
<p><strong>특징</strong></p>
<ul>
<li><p><strong>volatile memory</strong> : <em>실행 중에만 사용하는 변수들이 들어가며 <code>stack</code>, <code>arguments</code>, <code>memory</code>를 사용한다</em></p>
</li>
<li><p><strong>non-volatile memory</strong> : <em>실행 이후에도 지속되는 변수들이 들어가며 <code>code</code>, <code>storage</code>를 사용한다.</em>
↪ ✓ <strong><em>실행 이후에도 지속되는 변수는 Storage Trie에 저장되므로 용량의 크기에 따라 Storage fee가 발생한다</em></strong></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] Merkle Patricia Trie (MPT)]]></title>
            <link>https://velog.io/@moment_log/Cryptography-Merkle-Patricia-Trie-MPT</link>
            <guid>https://velog.io/@moment_log/Cryptography-Merkle-Patricia-Trie-MPT</guid>
            <pubDate>Fri, 03 Jun 2022 09:29:53 GMT</pubDate>
            <description><![CDATA[<h2 id="merkle-patricia-trie-mpt">Merkle Patricia Trie (MPT)</h2>
<p><strong><em>Merkle Patricia Trie란 이더리움에서 사용하는 자료구조이며 <a href="https://velog.io/@moment_log/Cryptography-Bloom-Filter-Merkle-tree#merkle-tree">Merkle trie</a>를 변형해서 사용한다</em></strong></p>
<h3 id="특징">특징</h3>
<ul>
<li><p><strong>_각각의 노드는 sha3을 이용해서 hashing 한다 _</strong></p>
</li>
<li><p><strong>_MPT는 key-value DB이다 _</strong>
↪ <em>level DB은 Go, C++, Python client에서 사용되고, rocks DB은 Parity client에서 사용된다. _
↪ _key는 각 Node의 hash이고 value는 각 Node의 값을 의미한다.</em></p>
</li>
<li><p><strong>_Merkle Tree처럼 하나의 Node라도 변경될 경우 Root Hash에 영향을 주게 되어 값의 안전성을 보장할 수 있다 _</strong></p>
</li>
</ul>
<h3 id="타입">타입</h3>
<ul>
<li><p><strong>NULL</strong> : <em>NULL은 빈 문자열값을 의미 한다.</em></p>
</li>
<li><p><strong>branch</strong> : <em>16<del>17개의 요소로 구성되어 있는 배열이다 0</del>15번 Index는 hashing된 주소값이 들어갈 수 있으며 <code>value</code>가 있는경우에는 마지막 index로 <code>value</code>의 값이 들어간다.</em>
↪ <em>hashing된 주소값은 index에 맞춰 들어간다</em></p>
</li>
<li><p><strong>leaf</strong> : <em>2개의 요소로 구성되어 있는 배열이며 <code>encodedPath</code>와 <code>value</code>값이 들어가 있다.</em></p>
</li>
<li><p><strong>extension</strong> : <em>2개의 요소로 구성되어 있는 배열이며 <code>encodedPath</code>와 <code>key</code>값이 들어가 있다.</em></p>
</li>
</ul>
<h3 id="hex-prefix-encoding">hex Prefix Encoding</h3>
<p><strong>_extension Node 와 leaf Node를 구별하기 위해 사용 _</strong>
↪<em>Merkle Patricia Trie는 nibble 단위로 저장된다, nibble은 4bit 즉 0.5byte이며 hex char역시도 4bit이며 1byte로 떨어지지 않을 경우 1byte를 맞추기 위해 0을 이용하여 padding한다.</em></p>
<table>
<thead>
<tr>
<th align="center">hex char</th>
<th align="center">node tpye</th>
<th align="center">path length</th>
</tr>
</thead>
<tbody><tr>
<td align="center">0</td>
<td align="center">extension</td>
<td align="center">even</td>
</tr>
<tr>
<td align="center">1</td>
<td align="center">extension</td>
<td align="center">odd</td>
</tr>
<tr>
<td align="center">2</td>
<td align="center">terminating (leaf)</td>
<td align="center">even</td>
</tr>
<tr>
<td align="center">3</td>
<td align="center">terminating (leaf)</td>
<td align="center">odd</td>
</tr>
</tbody></table>
<h3 id="📌-example">📌 Example</h3>
<blockquote>
<p><strong><em>가상의 path 예시</em></strong></p>
</blockquote>
<ul>
<li><strong>&lt;64 6f&gt;</strong> : <strong><em>&quot;Kevin&quot;</em></strong></li>
<li><strong>&lt;64 6f 67&gt;</strong> : <strong><em>&quot;FOEN&quot;</em></strong></li>
<li><strong>&lt;64 6f 67 65&gt;</strong> : <strong><em>&quot;David&quot;</em></strong></li>
<li><strong>&lt;68 6f 72 73 65&gt;</strong> : <strong><em>&quot;YAYA&quot;</em></strong></li>
</ul>
<blockquote>
<p><strong><em>가상의 key - value을 기준 trie 예시</em></strong>
<em>rootHash</em> : <strong>[ &lt;16&gt;, hashA ]</strong>
 <em>hashA</em> : <strong>[&lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, hashB, &lt;&gt;, &lt;&gt;, &lt;&gt;, hashC, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;]</strong>
 <em>hashB</em> : <strong>[&lt;00 6f&gt;, hashD ]</strong>
 <em>hashC</em> : <strong>[&lt;20 6f 72 73 65&gt;, &quot;YAYA&quot;]</strong>
 <em>hashD</em> : <strong>[&lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, hashE, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &quot;Kevin&quot;]</strong>
 <em>hashE</em> : <strong>[&lt;17&gt;, hashF]</strong>
 <em>hashF</em> : <strong>[&lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, hashG, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &lt;&gt;, &quot;FODEN&quot;]</strong>
 <em>hashG</em> : <strong>[&lt;35&gt;, &quot;David&quot;]</strong></p>
</blockquote>
<blockquote>
<h3 id="✏️-example-hash-특징">✏️ Example hash 특징</h3>
<p>__ hashA__ :  <strong><em>branch Node이며 <code>value</code>가 존재지 않기 때문에 16개의 hashing된 주소값이 들어갈 수 있는 <code>index</code>로만 이루어져 있다</em></strong>
<strong>hashB, hashE</strong> : <strong><em>extension Node이므로 <code>encodedPath</code>와 <code>key</code>로만 이루어져 있다</em></strong>
<strong>hashC, hashG</strong> : <strong><em>leaf Node이므로 <code>encodedPath</code>와 <code>value</code>로만 이루어져 있다</em></strong>
<strong>hashD, hashF</strong> : <strong><em>branch Node이며 <code>value</code>가 존재하므로 16개의 hashing된 주소값이 들어갈 수 있는 <code>index</code>와 <code>value</code>로 이루어져 있다.</em></strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BlockChain] Bitcoin]]></title>
            <link>https://velog.io/@moment_log/Cryptography-Bitcoin</link>
            <guid>https://velog.io/@moment_log/Cryptography-Bitcoin</guid>
            <pubDate>Mon, 23 May 2022 04:14:06 GMT</pubDate>
            <description><![CDATA[<h2 id="bitcoin">Bitcoin</h2>
<p><strong><em>Satishi Nakamoto가 2009년 발표한 대표적인 Public BlockChain 시스템</em></strong></p>
<h3 id="🪙-bitcoin의-특징">🪙 Bitcoin의 특징</h3>
<ul>
<li><p><strong>ECDSA</strong> 기반의 전자 서명 알고리즘 이용</p>
</li>
<li><p><strong>9000개 이상의 Full Node로 구성된 네트워크 보유</strong></p>
</li>
<li><p><strong>평균 10분마다 새로운 블록을 채굴</strong>
↪<em>PoW 난이도 조절을 통해 채굴 속도를 조절하며 이를 통해 <strong>stale block의 양을 줄이며, 51% Attack</strong>도 방지할 수 있다</em></p>
</li>
<li><p><strong>통화 발행을 2,100만개로 제한</strong>
↪<em>인플레이션 방지를 위함으로 추측하며 그 이후의 채굴자에게는 <strong>Tx Fee</strong>가 수수료로 돌아간다</em></p>
</li>
<li><p><strong>한 블록의 평균 크기는 1.29Mbyte</strong>
↪<em>한 블록당 약 2000개의 트랜잭션이 포함된다</em></p>
</li>
</ul>
<h3 id="🔑-key">🔑 Key</h3>
<p><strong>타원 곡선(Secp256k1)을 이용해 개인 키, 공개 키 사용</strong></p>
<ul>
<li><p><strong>타원 곡선</strong> : $Y^2 = (X^3 + 7) mod p$ </p>
</li>
<li><p><strong>Private Key ($k$)</strong> : $1$ ~ $2^{256}$ 사이의 랜덤한 숫자</p>
</li>
<li><p><strong>Public Key ($K$)</strong> : $k * G$
↪ $G$ : 타원 곡선 상의 고정된 점
↪ $*$ : 타원 곡선 상의 곱하기 연산</p>
</li>
</ul>
<blockquote>
<p>🖊<em>이 부분은 <a href="https://velog.io/@moment_log/Cryptography-Digital-Signature#ecdsa-%ED%83%80%EC%9B%90%EA%B3%A1%EC%84%A0-%EB%94%94%EC%A7%80%ED%84%B8-%EC%84%9C%EB%AA%85-%EA%B5%AC%EC%A1%B0">이전게시글</a>의 <strong>ECDSA</strong>부분을 참고하면 된다.</em></p>
</blockquote>
<h3 id="주소">주소</h3>
<p><strong>위에서 본 Public Key는 520bi, 즉 65Byte의 크기를 갖게 되는데 이럴 경우 블록에 담기에는 너무 큰 크기를 갖기 때문에 암호 해시를 이용해서 생성한다</strong></p>
<blockquote>
<p>📌 <em>Public Key $K$의 구조는 prefix 8bit, x좌표 256bit, y좌표 256bit로 총 <strong>520bit</strong>가 된다</em></p>
</blockquote>
<blockquote>
<h4 id="public-key를-이용하여-주소로-변환하는-과정">Public Key를 이용하여 주소로 변환하는 과정</h4>
</blockquote>
<h5 id="출처--oreilly">출처 : <a href="https://www.oreilly.com/library/view/mastering-bitcoin-2nd/9781491954379/ch04.html">oreilly</a></h5>
<p><img src="https://velog.velcdn.com/images/moment_log/post/58531f06-764a-4df4-8fdd-681c135b1710/image.png" height="100px" width="500px"></p>




<h3 id="base58check-encode">Base58Check Encode</h3>
<blockquote>
<h4 id="base58check-encode-과정">Base58Check Encode 과정</h4>
</blockquote>
<h5 id="출처--oreilly-1">출처 : <a href="https://www.oreilly.com/library/view/mastering-bitcoin-2nd/9781491954379/ch04.html">oreilly</a></h5>
<p><img src="https://velog.velcdn.com/images/moment_log/post/8c153f8c-7feb-419e-8d3f-8db81d830334/image.png" height="100px" width="500px"></p>

<ul>
<li><p><strong>Base-58</strong>
↪<em>숫자와 알파벳 중 햇갈릴 수 있는 <code>0</code>, <code>O</code>, <code>I</code>, <code>l</code> 네 개의 문자들을 제거한 58가지 문자로 인코딩하는 방법</em></p>
</li>
<li><p><strong>Prefix</strong>
↪<em>8bit이며 주소의 버전을 의미하며 자세한 목록들은 [여기서] (<a href="https://en.bitcoin.it/wiki/List_of_address_prefixes">https://en.bitcoin.it/wiki/List_of_address_prefixes</a>) 확인 가능하다</em></p>
</li>
<li><p><strong>Checksum</strong>
↪<em>에러를 체크할 수 있는 해싱된 코드이며 Payload 뒤에 붙여준다.</em></p>
</li>
</ul>
<h3 id="bsl">BSL</h3>
<p><strong>Bitcoin Script Language의 약자로 대표적인 특징으로 튜링 불완전성언어로 반복문의 기능이 없다는 점과 Stack기반의 프로그래밍언어로, 입력이 맞으면 TRUE, 그렇지 않으면 FALSE를 저장한다</strong></p>
<blockquote>
<p>📌 <strong><em>BSL에 관한 자세한 정보는 <a href="https://en.bitcoin.it/wiki/Script">위키피디아</a>에서 확인 가능하다</em></strong></p>
</blockquote>
<hr>
<h2 id="transaction">Transaction</h2>
<p><strong>비트코인에서의 트랜잭션은 화폐의 흐름을 표기</strong></p>
<pre><code class="language-JSON">{
  &quot;version&quot;: 1,
  &quot;locktime&quot;: 0, 
  &quot;vin&quot;: [{
    &quot;txid&quot;: &quot;7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18&quot;,
    &quot;vout&quot;: 0,
    &quot;scriptSig&quot; : &quot;3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787e c3457eee41c04f4938de5cc17b4a10fa336a8d752adf&quot;,
    &quot;sequence&quot;: 4294967295 }],
  &quot;vout&quot;: [{
    &quot;value&quot;: 0.01500000,
    &quot;scriptPubKey&quot;: &quot;OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG&quot;
  },
  {
    &quot;value&quot;: 0.08450000,
    &quot;scriptPubKey&quot;: &quot;OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG&quot;,
  }] 
}
</code></pre>
<ul>
<li><p><strong>Input</strong> : <em>트랜잭션 id와 포함한 Signature, Locking Script(scriptPubKey) 등이 포함되어 있다</em></p>
</li>
<li><p><strong>Output</strong> : <em>트랜잭션 결과로 가져갈 금액과 Unlocking Scrript(scriptSig)가 포함되어 있다</em></p>
</li>
<li><p><strong>Tx fee</strong> : _트랜잭션을 포함한 블록을 채굴할 마이너에게 지급되는 fee로 _<code>입력금액 - 출력금액</code>_으로 계산된다 _</p>
</li>
</ul>
<h3 id="tx-verification">Tx Verification</h3>
<h4 id="각-node들은-이웃-node들에게-전파하기-전-유효성을-검증한-후-전파한다">각 Node들은 이웃 Node들에게 전파하기 전, 유효성을 검증한 후 전파한다</h4>
<blockquote>
<p>📌 _각 Node들이 Tx를 검증하기 위한 자세한 CheckList는 <a href="https://www.oreilly.com/library/view/mastering-bitcoin/9781491902639/ch08.html">여기서</a> <code>Independent Verification of Transactions</code> 항목을 통해 확인 가능하다.
_</p>
</blockquote>
<h3 id="utxo">UTXO</h3>
<p>*<em>Unspent Transaction Outputs의 약자로 미사용 트랜잭션 출력 값을 의미한다 따라서 사용자의 총 잔고는 UTXO의 총합을 의미한다고 볼 수 있다. *</em></p>
<blockquote>
<p><em>예시를 들자면 A와 B가 나에게 각각 2,000원을 보내주었다고 했을 때 나의 잔고는 4,000원이 아닌 2,000원 두개가 된다.
다시 내가 C에게 3,000원을 보낼 경우 2,000원 두 개를 트랜잭션에 등록하여, 3,000원은 C에게, 1,000원은 나의 잔고로 등록이 된다.
트랜잭션이 등록되고 블록에 올라가기 전에는 Mempool에 등록되며 이를 통해 비트코인은 이중지불에 대한 방지를 할 수 있으며 거래에 대한 유효성을 검증하는데 사용된다.</em></p>
</blockquote>
<h3 id="coinbase-transaction">Coinbase Transaction</h3>
<h4 id="블록을-채굴한-miner에게-보상으로-지급되는-transaction">블록을 채굴한 Miner에게 보상으로 지급되는 Transaction</h4>
<blockquote>
<p>📌 _Miner에게 돌아가는 채굴의 보상은 기존의 UTXO의 거래 수수료와 Coinbase Tx의 합으로 가져가가며, 비트코인의 총 발행량인 2,100만개 이후에는 Coinbase Tx는 없이 순수 거래 수수료만 채굴 보상으로 받을 수 있다. _</p>
</blockquote>
<hr>
<h2 id="bitcoin-node">Bitcoin Node</h2>
<h4 id="노드들은-대표적으로-네-가지-역할을-갖고-있다">노드들은 대표적으로 네 가지 역할을 갖고 있다</h4>
<ul>
<li><p><strong><code>Routing</code></strong> : <em>트랜잭션과 블록을 검증 및 전파하며 다른 Peer와 연결을 유지</em></p>
</li>
<li><p><strong><code>BlockChainDB</code></strong> : <em>블록체인의 전체 혹은 헤더를 저장</em></p>
</li>
<li><p><strong><code>Mining</code></strong> : <em>새로운 블록을 추가 및 PoW알고리즘 수행</em></p>
</li>
<li><p><strong><code>Wallet</code></strong> : <em>사용자의 화폐, 주소, 키 관리 및 트랜잭션 생성</em></p>
</li>
</ul>
<h4 id="노드들은-크게-4가지로-분류할-수-있다">노드들은 크게 4가지로 분류할 수 있다.</h4>
<ul>
<li><p><strong>Full Node</strong> : <em><code>Routing</code>, <code>BlockChainDB</code>, <code>Mining</code>, <code>Wallet</code>기능을 모두 갖고 있는 노드</em></p>
</li>
<li><p><strong>SPV Node</strong> : <em>Simplified Payment Verification Node로 <code>Routing</code>, <code>Wallet</code> 기능을 갖고 있다</em></p>
</li>
<li><p><strong>Solo Miner</strong> : <em><code>Routing</code>, <code>BlockChainDB</code>, <code>Mining</code> 기능을 갖고 있으며 채굴을 주 목적으로 하는 Node</em></p>
</li>
<li><p><strong>Mining Node</strong> : <em>Pool protocol server에 의해 관리되는 <code>Mining</code>기능만 갖고 있는 Node</em></p>
</li>
</ul>
<blockquote>
<h3 id="spv-node-와-full-node-상호작용-단계">SPV Node 와 Full Node 상호작용 단계</h3>
</blockquote>
<ol>
<li><em>특정 <code>SPV Node</code> A가 다른 <code>SPV Node</code> B에게 보내는 <code>Trancsaction</code>을 생성 후 네트워크에 전파</em></li>
<li><em><code>Transaction</code>이 B에게 전다르 되면 정상적으로 전파된 것으로 확인가능하며 <code>Transaction</code>은 Pool에 저장된다</em></li>
<li><em>A가 B에게 보내는 <code>Transaction</code>이 포함된 블록을 후보 블록으로 생성한 <code>Miner</code>가 채굴에 성공할 경우 네트워크에 전파</em></li>
<li><em>다른 <code>Full Node</code>들도 블록을 검증하고 <code>SPV Node</code> B는 다른 <code>Full Node</code>에게 블록 헤더를 수신</em>
↪<em><code>SPV Node</code> B가 <code>Full Node</code>에게 자신의 <code>Transaction</code>이 포함 되었는지를 확인하기 위해 특정 <code>Transaction</code>만을 요청하면 <code>Full Node</code>는 <code>SPV Node</code> B를 특정할 수 도 있다. 이 때 <a href="https://velog.io/@moment_log/Cryptography-Bloom-Filter-Merkle-tree#bloom-filter"><strong><code>Bloom Filter</code></strong></a>를 이용한다</em></li>
</ol>
<hr>
<h2 id="bitcoin-block">Bitcoin Block</h2>
<h3 id="nonce-target-difficulty">nonce, Target, Difficulty</h3>
<ul>
<li><p><strong>nonce</strong> : <em>비트코인 <code>PoW</code>의 정답을 의미하며 <code>nonce</code>를 찾은 <code>Miner</code>가 <code>Coinbase</code>를 포함한 <code>Tx Fee</code>를 받아간다. <code>Miner</code>들이 <code>nonce</code>를 찾는 것은 어렵지만 주변 다른 <code>Node</code>들이 <code>nonce</code>를 검증하는 것은 쉽다는 특징이 있다</em></p>
</li>
<li><p><strong>Target</strong> : <em>비트코인 <code>PoW</code>의 문제를 의미하며 <code>Miner</code>는 <code>Target</code>보다 작은 해시값을 찾아야 한다.</em></p>
</li>
<li><p><strong>Difficulty</strong> : <em>비트코인 <code>PoW</code> <code>Target</code>의 난이도를 의미한다. 블록은 평균 10분에 1개가 채굴됙게 되는데 2,016개의 블록마다 채굴 평균속도가 길경우, <code>Difficulty</code>가 내려가고, 빠를경우 <code>Difficulty</code>가 올라간다</em></p>
</li>
</ul>
<h3 id="block-verfication">Block Verfication</h3>
<h4 id="miner가-nonce를-찾더라도-바로-블록에-올라가는-것이-아닌-nonce를-찾은-miner가-제안하는-블록을-검증-후-주변-노드들에게-전파한다">Miner가 nonce를 찾더라도 바로 블록에 올라가는 것이 아닌 nonce를 찾은 Miner가 제안하는 블록을 검증 후 주변 노드들에게 전파한다</h4>
<blockquote>
<p>📌 <em>각 Node들이 Block을 검증하기 위한 자세한 CheckList는 <a href="https://www.oreilly.com/library/view/mastering-bitcoin/9781491902639/ch08.html">여기서</a> <code>Validating a New Block</code> 항목을 통해 확인 가능하다.</em></p>
</blockquote>
<h3 id="orphan-block">Orphan Block</h3>
<h4 id="채택되지-못한-block을-의미하며-고아-블록이라고도-한다">채택되지 못한 Block을 의미하며 고아 블록이라고도 한다</h4>
<blockquote>
<p><em>만약 같은 height의 Block을 동시에 찾았다면 그것을 전파받은 Node들은 각자 검증 후 그 이후의 height의 Block을 채굴하며 최종적으로 제일 height가 높은 블록을 모두에게 전파한다. 이 과정에서 모두에게 전파되지 못한 블록들을 <strong>Orphan Block</strong>이라고 하며 이런 시스템 때문에 Block이 Chain에 올라가더라도 최종적으로 승인이 되기 위해선 6개의 Block이 올라가야 거래가 확정되며 Coinbase Tx도 100개의 Blcok 이후에 승인된다.</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] Bloom Filter & Merkle tree]]></title>
            <link>https://velog.io/@moment_log/Cryptography-Bloom-Filter-Merkle-tree</link>
            <guid>https://velog.io/@moment_log/Cryptography-Bloom-Filter-Merkle-tree</guid>
            <pubDate>Sat, 21 May 2022 15:53:19 GMT</pubDate>
            <description><![CDATA[<h2 id="bloom-filter">Bloom Filter</h2>
<h4 id="특정-집합에-포함되지-않은-데이터를-구분하기-용이한-자료구조">특정 집합에 포함되지 않은 데이터를 구분하기 용이한 자료구조</h4>
<ul>
<li><p><em>N bit 배열과 M개의 해시 함수로 구성되어 있다.</em></p>
</li>
<li><p><em>특정 패턴을 사용한 해시 함수를 이용하여 배열중 하나를 가르키게 되는데, 이 때 <strong>모두 1을 가르키는 경우 있을 가능성이 있는 것</strong>이고, <strong>한 개라도 0을 가르키면 확실하게 존재하지 않는 것</strong>이다.</em></p>
</li>
</ul>
<blockquote>
<p>✓ <strong><em>N = 18, M = 3인 Bloom Filter</em></strong>
<img src="https://velog.velcdn.com/images/moment_log/post/69e4df6b-4854-41f7-8622-7860eef66b00/image.jpeg" alt=""></p>
</blockquote>
<h2 id="merkle-tree">Merkle tree</h2>
<h4 id="트랜잭션이-저장된-블록의-무결성을-보장하기-위해-사용하는-자료구조">트랜잭션이 저장된 블록의 무결성을 보장하기 위해 사용하는 자료구조</h4>
<ul>
<li><p>_Binary Hash Tree구조를 갖고 있으며 계산이 단순하고 빠르다는 장점을 갖고 있다 _</p>
</li>
<li><p><em><a href="http://wiki.hash.kr/index.php/%EB%A8%B8%ED%81%B4%EA%B2%BD%EB%A1%9C">Merkle Path</a>를 이용해 트랜잭션이 블록에 포함되어 있는지를 쉽게 파악 가능하다</em></p>
</li>
<li><p><em>리프노드들을 <code>concatenate operator</code>를 통해 단순 더한 후 해싱하여 루트노드를 생성한다</em>
↪ 🖋 <em>트랜잭션 수가 홀수일 경우에는 마지막 트랜잭션의 해시값을 중복으로 계산한다</em></p>
</li>
</ul>
<blockquote>
<p>✓ <strong><em>Merkle tree</em></strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/moment_log/post/9e9cff42-2ab8-416c-81b3-30d0df33d821/image.png" height="100px" width="500px"></p>


]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] Digital Signature]]></title>
            <link>https://velog.io/@moment_log/Cryptography-Digital-Signature</link>
            <guid>https://velog.io/@moment_log/Cryptography-Digital-Signature</guid>
            <pubDate>Fri, 13 May 2022 10:45:20 GMT</pubDate>
            <description><![CDATA[<h2 id="digital-signature">Digital Signature</h2>
<h4 id="전자-문서의-데이터-무결성과-출처-증명을-위한-암호화-알고리즘">전자 문서의 데이터 무결성과 출처 증명을 위한 암호화 알고리즘</h4>
<h3 id="전자-서명--일반-서명">전자 서명 &amp; 일반 서명</h3>
<table>
<thead>
<tr>
<th align="center"></th>
<th>일반 서명</th>
<th>전자 서명</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><strong>특징</strong></td>
<td>문서에 포함한다 (낱인, 서명 등..)</td>
<td>문서와 서명이 분리된 파일로 존재</td>
</tr>
<tr>
<td align="center"><strong>관계</strong></td>
<td>1:n 관계</td>
<td>1:1 관계</td>
</tr>
<tr>
<td align="center"><strong>복제</strong></td>
<td>서명된 문서의 복사본과 원본은 구분이 가능</td>
<td>원본과 복사된 문서를 구분할 수 없으며 구분해야하는 경우 문서에 타임스탬프를 추가</td>
</tr>
</tbody></table>
<h3 id="전자서명-특징">전자서명 특징</h3>
<ul>
<li><strong>Message Authentication</strong> (인증)
↪<em>발신자의 공개키를 통해 검증되므로 발신자가 보낸 것을 인증가능 하다</em></li>
<li><strong>Message Integrity</strong> (무결성)
↪ _ 메세지가 수정될 경우 서명이 변경되기 때문에 무결성이 검증된다_</li>
<li><strong>Nonrepudiation</strong> (부인 방지)
↪ 신뢰가능한 제 3자를 있다면 발신자가 보낸 메세지를 발신자가 보내지 않았다고 주장하기 어렵다</li>
</ul>
<blockquote>
<p>𖤐<strong>_전자서명은 기밀성유지를 위해 사용되지 않는다. _</strong>
↪ <strong><em>Plain Text를 이용하여 서명할 경우에는 검증과정에서 PlainText가 그대로 노출 될 수도 있다. 이와 같은 이유와 비대칭 키 암호화의 특징을 고려해 PlainText를 해싱하여 Digest로 만든 후 서명한다</em></strong></p>
</blockquote>
<hr>
<h2 id="rsa-디지털-서명">RSA 디지털 서명</h2>
<h3 id="키-생성방법-🔑">키 생성방법 🔑</h3>
<blockquote>
<p>🖋 키 생성방법은 전에 정리한<a href="https://velog.io/@moment_log/Cryptography-RSA#%EC%83%9D%EC%84%B1-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98">RSA</a>의 키 생성방법과 동일하다! 😏</p>
</blockquote>
<h3 id="검증-🧐">검증 🧐</h3>
<blockquote>
<p><strong>_ 검증부분 역시 <a href="https://velog.io/@moment_log/Cryptography-RSA#rsa-%EC%A0%95%ED%99%95%EC%84%B1-%EC%A6%9D%EB%AA%85%EA%B3%BC-%EC%98%88%EC%8B%9C">RSA 검증</a> 부분과 비슷하다 _</strong> 🥲
$S$ : Signature 
$M$ : Message</p>
</blockquote>
<ul>
<li>$S = M^d mod n$</li>
<li>$S^e = (M^e mod n)^d = M^{ed} mod n$</li>
<li>$ed = k × φ⒩ + 1$</li>
<li>$S^e = M^{ed} mod n= M^{k × φ⒩ + 1} mod n$</li>
<li>$S^e = M^{k × φ⒩ + 1} mod n = M mod n$
⤷ 𖤐 <a href="https://velog.io/@moment_log/Cryptography-%EB%B9%84%EB%8C%80%EC%B9%AD-%ED%82%A4-%EC%95%94%ED%98%B8#euler-%EC%9D%98-%CF%86%E2%92%A9">φ⒩ 오일러의 정리</a> 마지막 부분 😉</li>
</ul>
<hr>
<h2 id="ecdsa-타원곡선-디지털-서명-구조">ECDSA (타원곡선 디지털 서명 구조)</h2>
<h3 id="키-생성-방법-🔑">키 생성 방법 🔑</h3>
<blockquote>
</blockquote>
<ol>
<li>타원 곡선 $E_p (a,b)$ 를 선택
⤷📌 <strong><em>$p$는 prime Number,소수이다</em></strong> 
⤷ $Y^2 mod p = (x^3 + ax + b) mod p$</li>
<li>다른 소수 $q$와 개인 키로 사용할 정수 $d$ 선택</li>
<li>타원 곡선 상 한 점 $e_1$를 선택한다
⤷<em>이 점을  generator라고도 한다</em></li>
<li>선택한 $e_1$와 개인 키로 사용하는 정수 $d$를 이용해 다른 한 점 $e_2$를 계산 한다
⤷<strong>$e_2(... , ...) = d×e_1(... , ...)$</strong></li>
<li>개인키는 선택한 정수 $d$가 되고, 공개키는 $e_2$가 된다
⤷ <strong><em>그러나 공개된 값이 $a, b, p, q, e_1, e_2$이기 때문에 모두 공개키라고 볼 수도 있다</em></strong></li>
</ol>
<h3 id="검증-🧐-1">검증 🧐</h3>
<blockquote>
<h4 id="sign">Sign</h4>
<p><strong><em>Temporary Private Key</em></strong> :  $r$
⤷ <strong><em>1 &lt; $r$ &lt; $q$ -1</em></strong>
<strong><em>Temporary Public Key</em></strong> : $P(u,v) = r×e_1(... , ...)$</p>
</blockquote>
<ul>
<li>$S_1$ : $u mod q$</li>
<li>$S_2$ : $(h(M) + d×S_1) × r^{-1} mod q$
⤷ ∴ Signature : ($S_1$, $S_2$)</li>
</ul>
<blockquote>
<h4 id="verify">Verify</h4>
</blockquote>
<ol>
<li>먼저 아래와 같이 가정한다
$A$ = $h(M)×S_2^{-1} mod q$
$B$ = $S_1×S_2^{-1} mod q$</li>
<li>Sign할 때 $S_2$를 만든 알고리즘을 통해 $r$의 값을 구한다
$S_2$ : $(h(M) + d×S_1) × r^{-1} mod q$
⤷ ✏️ $r$ : $(h(M) + d×S_1) × S_2^{-1} mod q$ </li>
<li><strong><em>Public Key</em></strong>를 이용하여 식을 간소화
⤷ $P(u,v) = r×e_1 = (h(M) + d × S_1) × S_2^{-1} mod q$
= $(h(M)× S_2^{-1}) + (d × S_1× S_2^{-1}) mod q$
= $A× e_1 + d × B × e_1 mod q$
= $A× e_1 + B × e_2 mod q$</li>
<li>타원 곡선 상 점 $T$의 좌표를 생성
⤷$T(x, y)$ = $A × e_1 + B × e_2$</li>
<li>$S_1 = u mod q$ 이므로 $S_1 = x mod q$ 일 경우 <strong>검증 완료</strong> 📝</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] 타원 곡선 암호]]></title>
            <link>https://velog.io/@moment_log/Cryptography-%ED%83%80%EC%9B%90-%EA%B3%A1%EC%84%A0-%EC%95%94%ED%98%B8</link>
            <guid>https://velog.io/@moment_log/Cryptography-%ED%83%80%EC%9B%90-%EA%B3%A1%EC%84%A0-%EC%95%94%ED%98%B8</guid>
            <pubDate>Thu, 05 May 2022 06:48:29 GMT</pubDate>
            <description><![CDATA[<h2 id="elliptic-curve-cryptosystem--타원-곡선-암호-시스템-">Elliptic Curve Cryptosystem ( 타원 곡선 암호 시스템 )</h2>
<h4 id="유한체상의-타원곡선-이론에-기반한-공개키-암호">유한체상의 타원곡선 이론에 기반한 공개키 암호</h4>
<h3 id="타원-곡선-암호-시스템의-특징">타원 곡선 암호 시스템의 특징</h3>
<ul>
<li><p>RSA의 키는 보통 1024bits 이상이지만 ECC는 256bit 이상의 크기를 갖으며 상대적으로 짧은 키의 길이로 같은 보안 수준을 제공할 수 있다.</p>
</li>
<li><p>실수 상의 타원곡선</p>
<ul>
<li>모든 근이 실근일 경우, 좌표의 수평선과 곡선이 3점에서 교차한다</li>
</ul>
</li>
</ul>
<blockquote>
<p>$y^2 = x^3 + ax + b$
_그래프 _ ⬇</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/moment_log/post/dd2d9fdd-83cd-4c51-9370-ac3a0d85c6cf/image.png" height="100px" width="400px"></p>



<h3 id="타원-곡선-상의-덧셈-연산">타원 곡선 상의 덧셈 연산</h3>
<h4 id="타원곡선-상에서-두-점pq을-정한-후-두-점을-지나가는-직선이-타원-곡선과-만나는-3번째-교점을--x축-기준으로-대칭되는-점을-r로-정의하여-계산하는-것을-기초한다">타원곡선 상에서 두 점($P$,$Q$)을 정한 후 두 점을 지나가는 직선이 타원 곡선과 만나는 3번째 교점을  $x$축 기준으로 대칭되는 점을 $R$로 정의하여 계산하는 것을 기초한다</h4>
<blockquote>
<p>$P$ = ($x_1$, $y_1$) , Q = ($x_2$, $y_2$)
$R$ = $P + Q$</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/moment_log/post/887b4840-8678-47f2-9f03-304fba47ba82/image.jpeg" height="100px" width="500px"></p> 

<h4 id="🖋-r--x_3-y_3-계산-방법">🖋 $R$ = ($x_3$, $y_3$) <strong>계산 방법</strong></h4>
<blockquote>
<h4 id="a--p-≠-q">$a$ . $P ≠ Q$</h4>
<p> $m$(기울기) = $(y_2 - y_1) / (x_2 - x_1)$ 
 $x_3 = m^2 - x_1 - x_2$
 $y_3 = m(x_1 - x_3) - y_1$</p>
</blockquote>
<blockquote>
<h4 id="b--p--q">$b$ . $P = Q$</h4>
<p> $m$(기울기) = $(3x_1^2 + a) / (2y_1)$ 
 $x_3 = m^2 - x_1 - x_2$
 $y_3 = m(x_1 - x_3) - y_1$</p>
</blockquote>
<h3 id="gfp상의-타원-곡선">GF($p$)상의 타원 곡선</h3>
<h4 id="gf는-galois-field-유한체를-의미하며-p는-prime-number-즉-소수를-의미한다">GF는 Galois Field, 유한체를 의미하며 $p$는 Prime Number 즉 소수를 의미한다</h4>
<p><strong>* Modulo $p$를 이용한 타원곡선 특징*</strong></p>
<ul>
<li><p>$x$의 값은  0~ $p$-1 사이에 존재한다.</p>
</li>
<li><p>덧셈연산은 덧셈 결과를 mod $p$연산 해준다.</p>
</li>
<li><p>역원은 $(x,y)$ 기준  $(x, -y)$이며 여기서 $-y$는 $y$의 덧셈에 대한 역원이다
↪<strong>_$p$가 13일때 $(1,4)$의 역원은 $(1,-4)$이며 즉 $(1,9)$이다 _</strong></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] 암호화와  해싱]]></title>
            <link>https://velog.io/@moment_log/Cryptography-%EC%95%94%ED%98%B8%ED%99%94%EC%99%80-%ED%95%B4%EC%8B%B1</link>
            <guid>https://velog.io/@moment_log/Cryptography-%EC%95%94%ED%98%B8%ED%99%94%EC%99%80-%ED%95%B4%EC%8B%B1</guid>
            <pubDate>Sun, 01 May 2022 14:53:38 GMT</pubDate>
            <description><![CDATA[<h2 id="해싱">해싱</h2>
<p>Hashing(해싱)은 해싱된 값을 통하여 데이터의 무결성을 증명할 수 있는 수단이다</p>
<h3 id="암호-해싱-함수">암호 해싱 함수</h3>
<p><strong><em>입력 문서를 고정된 길이의 데이터로 변환하며 역으로 고정된 길이로는 입력 문서를 찾을 수 없는 단방향 속성을 갖고 있다.</em></strong></p>
<h4 id="종류">종류</h4>
<ul>
<li><p><strong>MD5</strong> : 1991년 만들어진 128비트 알고리즘 
⤷<em>충돌 저항성</em> ⬇</p>
</li>
<li><p><strong>SHA-1</strong> :  1995년 미국의 NIST에서 만들어진 160비트 알고리즘
⤷<em>충돌 저항성</em> ⬇</p>
</li>
<li><p><strong>SHA-2</strong> : 2002년 미국 NIST에서 만들어진 알고리즘이며 해시 값의 크기에 따라 나뉜다
⤷<em>SHA-256 , SHA-384 , SHA-512등이 있으며 <strong>SHA-256은 BitCoin에서도 사용된다</strong></em> </p>
<ul>
<li><strong>SHA-3</strong> : 2012년 미국 NIST에서 선정되었다.
⤷_SHA3-224 , SHA3-256 , SHA3-384 ,  SHA3-512등이 있으며</li>
<li><em>Ehtereum에서 사용하는 Keccak-256의 기반이 되었다*</em>_ </li>
</ul>
</li>
</ul>
<h3 id="𖤐-암호-해시-함수의-조건">𖤐 암호 해시 함수의 조건</h3>
<p>$M$ : <code>Message</code> , $H()$ : <code>Hash function</code>, $H(M)$ : <code>Digest</code></p>
<blockquote>
</blockquote>
<ul>
<li><strong>Preimage resistance</strong> (단방향성) 
$y = H(M)$일 경우 <strong>공격자가 $y$와 $H()$를 이용하여 $M$을 발견하는 것은 어려워야 한다</strong></li>
<li><strong>Second Preimage resistance</strong> (약한 충돌 저항성) 
$M$과 $H(M)$이 주어졌을 때 <strong>$M&#39;$ ≠ $M$ 이면서 $H(M&#39;)$ = $H(M)$인 $M&#39;$를 찾기 어려워야 한다</strong>
⤷<em><strong>Message와 해싱된 값이 주어졌을 경우, 해싱된 값이 같으면서 다른 Message를 찾긱 어려워야 한다</strong></em></li>
<li><strong>Collision resistnace</strong> (충돌 저항성) 
$H(M)$ == $H(M&#39;)$인 서로 다른 메세지 $M$과 $M&#39;$를 찾기 어려워야 한다
⤷<em><strong>a가 해싱된 값이 0일 경우와 b가 해싱된 값이 0일 경우 b를 찾기 어려워야 한다</strong></em></li>
</ul>
<h3 id="상용-암호-해시-알고리즘">상용 암호 해시 알고리즘</h3>
<blockquote>
<h4 id="iterative-hashing">Iterative Hashing</h4>
</blockquote>
<ol>
<li>메시지를 $n$비트 크기의 블록으로 분할하며 마지막 블록에 메세지의 길이 블록을 추가한다</li>
<li>메시지를 분할한 블록의 수 만큼 해싱한다
⤷<em>*<em>i단계에서는 *</em></em>$H_{i-1}$ , $M_i$<em>*<em>의 값을 받아 Hashing하여 $H_i$를 생성한다 *</em></em><ol start="3">
<li>최종 생성되는 Digest 값이 최종 해싱된 값($H$)이 된다</li>
</ol>
</li>
</ol>
<hr>
<h2 id="mdc-modification-detection-code">MDC (Modification Detection Code)</h2>
<h4 id="변경-감지-코드라고-하며-해당-메시지가-변경되지-않았다는-것을-보장하기-위해-사용한다">변경 감지 코드라고 하며 해당 메시지가 변경되지 않았다는 것을 보장하기 위해 사용한다</h4>
<p>⤷<em>무결성은 증명가능하지만 송신자를 인증 불가능하다는 단점이 있다</em></p>
<blockquote>
<p>🖊 <code>Message</code>를 해싱한 <code>MDC</code>와 <code>Message</code>를 보내서 검증한다</p>
</blockquote>
<ul>
<li><h3 id="mac-message-authentication-code">MAC (Message Authentication Code)</h3>
</li>
</ul>
<h4 id="송신자와-수신자-사이에-대칭-key를-이용해-mdc를-검증한다">송신자와 수신자 사이에 대칭 Key를 이용해 MDC를 검증한다</h4>
<p>⤷<em>송신자 인증까지는 가능하지만 <code>Key</code>가 노출될 위험이 있을 수 있다.</em></p>
<blockquote>
<p>🖊 송신자는 <code>Message</code>와 <code>Key</code>를 이용해 해싱한 <code>MDC</code>와 <code>Message</code>를 보내며 수신자는 자신이 갖고 있는 <code>Key</code>를 이용해 <code>Message</code>와 해싱하여 <strong>받은 <code>DMC</code>와 수신자 본인이 해싱한 <code>DMC</code>가 같은 지를 검증하여 무결성과 송신자가 맞는지를 증명한다</strong></p>
</blockquote>
<ul>
<li><h3 id="hmac-hased-message-authentication-code">HMAC (Hased Message Authentication Code)</h3>
<h4 id="nist에서-사용하는-표준-mac이다">NIST에서 사용하는 표준 MAC이다</h4>
</li>
</ul>
<blockquote>
<p>🖊 송신자는 <code>Message</code>, <code>Key</code>, <code>ipad</code>를 이용해 해싱한 값을 다시한번 <code>key</code>와 <code>opad</code>를 이용해 해싱한 <code>HMDC</code>와 <code>Message</code>를 수신자에게 보내며 수신자는 동일한 방법으로 검증한다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/moment_log/post/8eba7a3c-edfd-4b3c-bf7a-0841b1f26118/image.jpeg" height="100px" width="500px"></p>

]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] RSA ]]></title>
            <link>https://velog.io/@moment_log/Cryptography-RSA</link>
            <guid>https://velog.io/@moment_log/Cryptography-RSA</guid>
            <pubDate>Wed, 27 Apr 2022 11:43:22 GMT</pubDate>
            <description><![CDATA[<h2 id="rsa">RSA</h2>
<p>가장 널리 쓰는 공개 키 알고리즘 중 하나로 전자서명이 가능한 최초의 공개 키 알고리즘으로 알려져 있다.</p>
<h3 id="개념">개념</h3>
<blockquote>
<ul>
<li><em>**Public Key</em> : <code>e</code>, <code>n</code> ** 
⤷ <em><code>Plain Text</code>의 크기는 <code>n</code>을 넘을 수 없으며 <code>n</code>은 1024 bits 이상의 수 이다</em></li>
</ul>
</blockquote>
<ul>
<li><strong>* Private Key* : <code>d</code></strong></li>
<li>$C = P^e mod n$</li>
<li>$P = C^d mod n$</li>
</ul>
<h3 id="생성-알고리즘">생성 알고리즘</h3>
<blockquote>
<p>*<em>1. 512비트 이상의 큰 소수 <code>p</code>, <code>q</code>를 선택 *</em>
⤷  <em><code>p</code> ≠ <code>q</code> _ 
2. *<em><code>n</code> = <code>p</code> × <code>q</code> *</em>
⤷  _n은 1024비트 이상의 수가 된다</em>
3. ** <code>φ⒩</code> = <code>( p - 1)</code> × <code>( q - 1 )</code>  **
4. ** <code>φ⒩</code> 와 서로소인 <code>e</code>를 선택 ⇒ _ 1 &lt; e &lt; φ⒩ _ **</p>
</blockquote>
<ul>
<li><strong>Public Key : <code>e</code>, <code>n</code></strong></li>
<li>*<em>Private Key : <code>d</code> =  <code>e⁻¹ mod φ⒩</code> *</em>
⤷<em>확장 유클리드 알고리즘 사용</em></li>
</ul>
<h3 id="rsa-정확성-증명과-예시">RSA 정확성 증명과 예시</h3>
<ul>
<li><strong>전송한 PlainText($P$)가 전송받은 CipherText($C$)를 복호화 한 PlainText($P_1$)과 같다는 걸 증명</strong></li>
</ul>
<blockquote>
<ul>
<li>$P^1 = C^d  mod n = (P^e mod n)^d = P^{ed} mod n$</li>
</ul>
</blockquote>
<ul>
<li>$ed = k × φ⒩ + 1$</li>
<li>$P^1 = P^{ed} mod n= P^{k × φ⒩ + 1} mod n$</li>
<li>$P^1 = P^{k × φ⒩ + 1} mod n = P mod n$
⤷ 𖤐 <a href="https://velog.io/@moment_log/Cryptography-%EB%B9%84%EB%8C%80%EC%B9%AD-%ED%82%A4-%EC%95%94%ED%98%B8#euler-%EC%9D%98-%CF%86%E2%92%A9">φ⒩ 오일러의 정리</a> 마지막 부분 참고!</li>
</ul>
<h3 id="euclidean-algorithm-유클리드-알고리즘">Euclidean algorithm (유클리드 알고리즘)</h3>
<p>두 수를 받아 나머지연산을 하여 최대 공약수를 구하는 알고리즘으로 <strong><code>golang</code></strong>을 이용하여 구현하면 다음과 같다</p>
<pre><code class="language-go">func main() {
    var a, b int
    reader := bufio.NewReader(os.Stdin)
    fmt.Fscanf(reader, &quot;%d %d&quot;, &amp;a, &amp;b)  // a,b를 입력 받는다
    if a &lt; b {
        a, b = b, a // 나머지 연산을 하기 위해 b가 a보다 클 경우 자리를 바꿔준다
    }
    gcd := 0  // 최대공약수 선언
    for {
        r := a % b 
        if r == 0 {
            //나머지 연산 값이 0일 경우 최대 공약수 값은 0이 되며 반복문은 종료
            gcd = b
            break
        }
        // 나머지 연산 값이 0이 아닐 경우  a에는 b를, b에는 나머지 연산 값을 선언해서 반복 
        a = b
        b = r
    }
    fmt.Println(gcd)
}
</code></pre>
<h3 id="𖤐-extended-euclidean-algorithm-확장-유클리드-알고리즘">𖤐 Extended Euclidean algorithm (확장 유클리드 알고리즘)</h3>
<ul>
<li>RSA에서 Private Key를 구하기 위해 사용한다.<pre><code class="language-go">func main() {
  var a, b int
  reader := bufio.NewReader(os.Stdin)
  fmt.Fscanf(reader, &quot;%d %d&quot;, &amp;a, &amp;b)
  r1 := a
  r2 := b
  t1 := 0
  t2 := 1
  for r2 &gt; 0 {
      q := r1 / r2
      r := r1 - q*r2
      r1, r2 = r2, r
      t := t1 - q*t2
      t1, t2 = t2, t
      r = a % b
      if r1 != 1 {
          // if r1 != 1일 경우 a, b가 최대공약수가 1이 아니므로, b의 inverse는 존재하지 않는다
          fmt.Println(0)
      }
      if t1 &lt; 0 {
          // 만약 t1이 음수가 되면 &quot;t1 % n&quot; 또는 t1을 더해주어서 해결한다
          t1 = a + t1
      }
  }
  fmt.Println(t1)
}</code></pre>
</li>
</ul>
<h3 id="암호화와-복호화">암호화와 복호화</h3>
<ul>
<li><strong>Encryption (암호화)</strong> : PlainText(P)와 공개키 e, n을이용해 $P^e mod n$을 계산<pre><code>RSA_Encryption (P, e, n) {
  C = Fast_Exponentiation(P, e, n)
  retrun C
}</code></pre></li>
<li><strong>Decryption (복호화)</strong> : CipherText(C)와 비공개키 d, n을이용해 $C^d mod n$을 계산<pre><code>RSA_Decryption (C, d, n) {
  P = Fast_Exponentiation(C, d, n)
  retrun P
}</code></pre></li>
</ul>
<h4 id="fast_exponentiation">Fast_Exponentiation</h4>
<p>$y= a^x mod n$을 계산하며 계산 시간을 단축하기 위해 <strong><code>Square and Multiply</code></strong> 개념을 이용해서 계산</p>
<blockquote>
<p>$y= a^9 = a^{1001_2} = a^8 × 1 × 1 × a$</p>
</blockquote>
<p>위와 같은 식을 <code>golang</code>의 <strong><code>rsa</code></strong> 패키지를 이용하여 구현할 수 있고, 패키지 안의 코드는 아래와 같다</p>
<pre><code class="language-go">func SquareAndMultiply(base int, exp int, modulo int) int {
    res := base
    // converst the number to a string of 0 and 1 in binary
    bin := strconv.FormatInt(int64(exp), 2)
    for e := 1; e &lt; len(bin); e++ {
        res *= res
        res %= modulo
        if bin[e] == &#39;1&#39; {
            res *= base
            res %= modulo
        }
    }
    return res
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] 비대칭 키 암호]]></title>
            <link>https://velog.io/@moment_log/Cryptography-%EB%B9%84%EB%8C%80%EC%B9%AD-%ED%82%A4-%EC%95%94%ED%98%B8</link>
            <guid>https://velog.io/@moment_log/Cryptography-%EB%B9%84%EB%8C%80%EC%B9%AD-%ED%82%A4-%EC%95%94%ED%98%B8</guid>
            <pubDate>Sun, 24 Apr 2022 15:00:38 GMT</pubDate>
            <description><![CDATA[<h2 id="asymmetric-key-비대칭-키-암호">Asymmetric Key (비대칭 키) 암호</h2>
<h4 id="비밀-키와-공개-키를-한-쌍으로-암호-키로-사용하여-암호화">비밀 키와 공개 키를 한 쌍으로 암호 키로 사용하여 암호화</h4>
<h3 id="활용-메커니즘">활용 메커니즘</h3>
<ul>
<li><strong>비밀 메시지</strong> : <code>A</code>의 공개키로 암호화한 암호는 <code>A</code>의 비밀 키로 복호화</li>
<li><strong>전자 서명</strong> : <code>A</code>의 비밀 키로 암호화한 암호는 <code>A</code>가 암호화 했다고 증명 가능</li>
</ul>
<h3 id="𖤐-대칭-키-암호와-비대칭-키-암호의-차이">𖤐 대칭 키 암호와 비대칭 키 암호의 차이</h3>
<table>
<thead>
<tr>
<th></th>
<th>대칭 키</th>
<th>비대칭 키</th>
</tr>
</thead>
<tbody><tr>
<td>개념 및 키 구성 차이</td>
<td>같은 키를 두 사람이 공유</td>
<td>공개 키는 공개되어 있지만 개인의 비밀 키는 공개하지 않음</td>
</tr>
<tr>
<td>암호화 방식</td>
<td><strong>C</strong> = Ek(P)</td>
<td><strong>C</strong> = f(PublicKey, P)</td>
</tr>
<tr>
<td>복호화 방식</td>
<td><strong>P</strong> = Dk(C)</td>
<td><strong>P</strong> = g(PrivateKey, C)</td>
</tr>
<tr>
<td>알고리즘의 실행 시간</td>
<td>빠르다</td>
<td>상대적으로 느리다</td>
</tr>
<tr>
<td>활용</td>
<td>길이가 긴 메시지를 암호화</td>
<td>짧은 데이터 암호화, 전자서명, 인증 등</td>
</tr>
</tbody></table>
<hr>
<h3 id="one-way-function">One-Way Function</h3>
<p>단 방향 함수라고도 하며 가장 대표적인 예시로 <strong><code>해시함수</code></strong>가 있다.</p>
<ul>
<li><strong>x</strong>가 주어질 경우 <code>f(x)</code>의 계산은 쉽지만, <strong>y</strong>가 주어지더라도 <code>f⁻¹(y)</code>를 통해 x를 계산하는건 어렵다</li>
</ul>
<blockquote>
<p><strong><code>y = xᵏ mod n</code></strong>
<em>만약 <code>n&gt;x</code>이고 <code>x</code>와 <code>k</code>가 주어진다면 계산이 쉽다.</em>
<em>그러나 <code>y</code>, <code>n</code>, <code>k</code>을 이용하여 _<strong><code>x</code></strong>_를 계산하는 것은 어렵다.</em></p>
</blockquote>
<hr>
<h3 id="trapdoor">Trapdoor</h3>
<p>단 방향 함수이며 힌트가 주어지면 <code>f⁻¹(y)</code>를 이용해 <code>x</code>를 구할 수 있다</p>
<blockquote>
<p><strong><code>k * k&#39; = 1 mod n</code></strong>이고, <strong><code>k</code></strong>를 알 수 있다면 
<strong><code>x = yᵏ mod n</code></strong>을 이용해 x를 구할 수 있다
 ↪ <strong><code>k</code></strong> :_ 공개 키, <em><strong><code>k&#39;</code></strong> :</em> 비공개 키_</p>
</blockquote>
<hr>
<h3 id="euler-의-φ⒩">Euler 의 φ⒩</h3>
<p> <strong>Z<sub>n</sub>* *<em>에 속하고 *</em><code>n</code></strong>보다 작으면서 <strong><code>n</code></strong>과 서로소인 정수의 개수 </p>
<h4 id="🖊-φ⒩-특징">🖊 φ⒩ 특징</h4>
<blockquote>
<ul>
<li><strong><code>φ(1)</code> = <code>0</code></strong></li>
</ul>
</blockquote>
<ul>
<li><em><code>p</code>가 소수일 경우</em> ⮕  <strong><code>φ(p)</code> = <code>p-1</code></strong> </li>
<li><em><code>p</code>가 소수일 경우</em> ⮕  <strong><code>φ(pᵉ)</code> = <code>pᵉ</code> - <code>pᵉ⁻¹</code></strong> </li>
<li><em><code>m</code>과 <code>n</code>이 서로수일 경우</em>   ⮕ <strong><code>φ(m * n)</code> = <code>φ(m)</code> * <code>φ(n)</code></strong> </li>
</ul>
<h4 id="🖊-φ⒩-오일러의-정리">🖊 φ⒩ 오일러의 정리</h4>
<blockquote>
<ul>
<li><em><code>a</code>과 <code>n</code>이 서로수일 경우</em>   ⮕ <strong>$a^{φ(n)} = 1  mod  n$</strong></li>
</ul>
</blockquote>
<ul>
<li><em><code>a &lt; n</code>이고 <code>k</code>가 정수일 경우</em>   ⮕ <strong>$a^{k × φ(n)+1} = a  mod  n$</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] 대칭키 암호]]></title>
            <link>https://velog.io/@moment_log/Cryptography-%EB%8C%80%EC%B9%AD%ED%82%A4-%EC%95%94%ED%98%B8</link>
            <guid>https://velog.io/@moment_log/Cryptography-%EB%8C%80%EC%B9%AD%ED%82%A4-%EC%95%94%ED%98%B8</guid>
            <pubDate>Fri, 22 Apr 2022 02:49:10 GMT</pubDate>
            <description><![CDATA[<h2 id="symmetric-key-대칭키-암호">Symmetric Key (대칭키) 암호</h2>
<h4 id="암호화와-복호화를-하기-위해-사용되는-키가-동일한-경우">암호화와 복호화를 하기 위해 사용되는 키가 동일한 경우</h4>
<h3 id="𖤐-대칭키-알고리즘">𖤐 대칭키 알고리즘</h3>
<blockquote>
<p><em><strong>평문</strong> (P) : PlainText, <strong>암호문</strong> (C) : CipherText , <strong>키</strong> (K) : Key,
<strong>암호화 알고리즘</strong> (E) : Encryption Algorithm , <strong>복호화 알고리즘</strong> (D) : Decryption Algorithm</em></p>
</blockquote>
<ul>
<li><strong>C</strong> = <code>E⒦( P )</code></li>
<li><strong>P</strong> = <code>D⒦( C )</code></li>
<li><strong>송신자</strong> : <code>E⒦( P )</code></li>
<li><strong>수신자</strong> : <code>D⒦( C )</code> = <code>D⒦( E⒦ ( P ) )</code> = <code>P</code></li>
</ul>
<h3 id="𖤐-kerckhoff의-원리">𖤐 Kerckhoff의 원리</h3>
<h4 id="암호화에서-암호화-알고리즘의-안전성보다-키의-안전성이-더-중요하다">암호화에서 암호화 알고리즘의 안전성보다 키의 안전성이 더 중요하다</h4>
<ul>
<li>공격자는 항상 암호화 알고리즘 ( E )와 복호화 알고리즘( D )은 알고리즘은 알고있다고 가정해야한다</li>
<li>그러므로 안전성은 키의 안전성에 바탕을 둔다</li>
</ul>
<h3 id="암호-해독-공격">암호 해독 공격</h3>
<ul>
<li><strong>Brute-Force Attack</strong> (전수조사 공격) : 암호문을 가로챈 후 모든 가능한 키를 사용하여 복호화 한 후 평문 획득</li>
<li><strong>Statistical Attack</strong> (통계적인 공격) : 평문언어의 고유한 특징들 을 이용하여 복호화한다 예를 들어 영어에서 제일 빈번하게 나오는 단어는 <code>E</code>이며 암호문 역시 가장 빈번하게 나오는 단어를 <code>E</code>라고 가정하고 복호화 한다</li>
<li><strong>Pattern Attack</strong> (패턴 공격) : 암호문에서 존재하는 패턴을 연구해 복호화</li>
</ul>
<hr>
<h2 id="대치-암호">대치 암호</h2>
<h4 id="어떠한-기호를-다른-기호로-대체하는-암호종류">어떠한 기호를 다른 기호로 대체하는 암호종류</h4>
<ul>
<li><strong>Monoalphabetic ciphers</strong> (단일문자 암호) : 평문의 기호와 대응하는 암호문 기호는 항상 1:1 대응관계</li>
<li><strong>Polyalphabetic ciphers</strong> (다중문자 암호) : 평문의 기호와 대응하는 암호문 기호는 1:M 대응관계</li>
</ul>
<h3 id="📍-단일-문자-암호">📍 단일 문자 암호</h3>
<h3 id="additive-cipher-덧셈-암호">Additive Cipher (덧셈 암호)</h3>
<h4 id="가장-기본적인-암호이며-알파벳을-기준으로-평문과-암호문의-키는-z26의-원소가-된다">가장 기본적인 암호이며 알파벳을 기준으로 평문과 암호문의 키는 Z26의 원소가 된다</h4>
<blockquote>
<p><strong>C</strong>(암호문) = (P + k) mod 26
 <strong>P</strong>(평문) = (C - k) mod 26
<img src="https://velog.velcdn.com/images/moment_log/post/ecb1e13d-8232-4ea0-ac56-40509878dcf5/image.png" alt=""></p>
</blockquote>
<h3 id="multiplicative-cipher-곱셈-암호">Multiplicative Cipher (곱셈 암호)</h3>
<h4 id="키는-평문과-암호문이-해당하는-z26의-원소에서-역원이-존재하는-원소">키는 평문과 암호문이 해당하는 Z26의 원소에서 역원이 존재하는 원소</h4>
<blockquote>
<p><strong>C</strong>(암호문) = ( P * k ) mod 26
 <strong>P</strong>(평문) = (C * k^-1) mod 26</p>
</blockquote>
<h3 id="affine-cipher-아핀-암호">Affine Cipher (아핀 암호)</h3>
<blockquote>
<p>덧셈 암호와 곱셈 암호를 결합하여 두개의 키를 사용한 암호</p>
</blockquote>
<h3 id="📍-다중-문자-암호">📍 다중 문자 암호</h3>
<h3 id="autokey-cipher-자동키-암호">Autokey Cipher (자동키 암호)</h3>
<blockquote>
<p>첫 번째 키를 미리 정의한 후 나머지 키는 평문의 문자를 이용해서 암호화하는 방식</p>
</blockquote>
<h3 id="playfair-cipher-플레이페어-암호">Playfair Cipher (플레이페어 암호)</h3>
<blockquote>
<p>1차 세계대전에서 영국군이 사용한 암호 방식이며 5 * 5 행렬로 배열된 알파벳 문자로 이루어진 비밀키를 기준으로 규칙을 정해 </p>
</blockquote>
<hr>
<h2 id="전치-암호">전치 암호</h2>
<h4 id="기호를-다른-기호로-변경하는-것이-아닌-재-정렬시켜-암호화하는-방식">기호를 다른 기호로 변경하는 것이 아닌 재 정렬시켜 암호화하는 방식</h4>
<h3 id="📍-keyless-transpostion-ciphers-키가-없는-전치-암호">📍 Keyless Transpostion ciphers (키가 없는 전치 암호)</h3>
<h3 id="rail-fence-암호">Rail fence 암호</h3>
<blockquote>
<p>평문을 합의한 열의 개수를 기준으로 단어를 재조합하는 방법</p>
</blockquote>
<ul>
<li><strong>☼ 열 2개로 암호화</strong>
Hello World =&gt; <strong><code>HLOOL</code></strong> , <strong><code>ELLWRD</code></strong></li>
</ul>
<h3 id="📍-keyed-transpostion-ciphers-키가-있는-전치-암호">📍 Keyed Transpostion ciphers (키가 있는 전치 암호)</h3>
<blockquote>
<p>사전에 합의된 크기로 평문을 블록 단위로 나눈 뒤 각각의 블록에 키를 대입하여 재배치하는 방법</p>
</blockquote>
<ul>
<li><strong>☼ 2개로 암호화</strong></li>
<li><table>
<thead>
<tr>
<th align="center">2</th>
<th align="center">1</th>
</tr>
</thead>
<tbody><tr>
<td align="center">1</td>
<td align="center">2</td>
</tr>
</tbody></table>
</li>
<li>Hello World =&gt; <strong><code>EH</code>,<code>LL</code>, <code>WO</code> , <code>RO</code>, <code>DL</code></strong></li>
</ul>
<hr>
<h2 id="𖤐-aes-advanced-encryption-standard">𖤐 AES (Advanced Encryption Standard)</h2>
<h4 id="2001년-nist미국-국립기술-표준원에서-공표한-대칭키-암호-알고리즘이며-높은-안정성과-속도로-전-세계적으로-많이-이용하고-있으며-암호화-키의-길이에-따라-aes-128-aes-192-aes-256로-나뉜다">2001년 NIST(미국 국립기술 표준원)에서 공표한 대칭키 암호 알고리즘이며 높은 안정성과 속도로 전 세계적으로 많이 이용하고 있으며 암호화 키의 길이에 따라 AES-128, AES-192, AES-256로 나뉜다</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Cryptography] 보안과 모듈러 연산]]></title>
            <link>https://velog.io/@moment_log/Cryptography-%EB%B3%B4%EC%95%88%EA%B3%BC-%EB%AA%A8%EB%93%88%EB%9F%AC-%EC%97%B0%EC%82%B0</link>
            <guid>https://velog.io/@moment_log/Cryptography-%EB%B3%B4%EC%95%88%EA%B3%BC-%EB%AA%A8%EB%93%88%EB%9F%AC-%EC%97%B0%EC%82%B0</guid>
            <pubDate>Mon, 18 Apr 2022 13:41:13 GMT</pubDate>
            <description><![CDATA[<h2 id="보안">보안</h2>
<p>보안을 위해 보통 세 가지 목표를 잡는다고 한다 이 세 가지 요소의 앞 글자를 따서 <strong><code>CIA</code></strong>라고 이야기하기도 한다</p>
<ol>
<li><p>기밀성 (Confidentality) : 인가된 사람들만 정보를 조회 및 접근할 수 있다 </p>
<p>𐃉 <strong>위협하는 공격</strong> : Snooping, 트래픽 분석 등 외부에서 비인가 데이터에 접근 혹은 탈취하는 공격들 </p>
</li>
<li><p>무결성 (Integrity) : 정보들은 무단으로 상태가 변경되지 않도록 한다 
𐃉 <strong>위협하는 공격</strong> : Spoofing 등 다른 사람으로 위장하여 정보를 조작하거나 탈취 후 다른 시점에 재사용하는 공격들 </p>
</li>
<li><p>가용성 (Availability) : 인가된 사람들이 정보를 이용함에 문제가 없어야 한다
𐃉 <strong>위협하는 공격</strong> : DoS(Denial of Service) 종류의 서비스를 느리게 하거나 완전히 차단할 수 있는 공격들</p>
</li>
</ol>
<hr>
<h2 id="modular-arithmetic모듈러-연산">Modular Arithmetic(모듈러 연산)</h2>
<p>모듈러 연산이란 <strong>정수</strong>와 <strong>정수</strong>를 나눗셈 연산을 하여 나온 나머지를 계산하는 연산이라고 볼 수 있다</p>
<h3 id="표기법">표기법</h3>
<h4 id="9를-2로-나누었을때-나머지">9를 2로 나누었을때 나머지</h4>
<pre><code>9 % 2</code></pre><pre><code>X = 9 mod 2</code></pre><h3 id="특성">특성</h3>
<ul>
<li><strong><code>a ≡ b mod n</code></strong> = <strong><code>b ≡ a mod n</code></strong></li>
<li><strong><code>a ≡ b mod n</code></strong> &amp;&amp; <strong><code>b ≡ c mod n</code></strong> =&gt; <code>a = c</code></li>
<li><strong><code>(a + b) mod n</code></strong> = <strong><code>((a mod n) + (b mod n)) mod n</code></strong></li>
<li><strong><code>(a - b) mod n</code></strong> = <strong><code>((a mod n) - (b mod n)) mod n</code></strong></li>
<li><strong><code>(a * b) mod n</code></strong> = <strong><code>((a mod n) * (b mod n)) mod n</code></strong></li>
</ul>
<h3 id="equivalence-classes">Equivalence Classes</h3>
<p>같은 수로 모듈러 계산을 할 때 나오는 값이 같으면 동치류라고도 하며 이 동치류 원소들은 해당 모듈러 연산 기준으로는 동일한 값으로 취급된다</p>
<blockquote>
<p>예시
1 ≡ 3 mod 2
1 ≡ 5 mod 2
1 ≡ 19 mod 2
1 ≡ 231123 mod 2</p>
</blockquote>
<h4 id="위처럼-3-5-19-231123은-mod-2-안에서는-같은-값으로-취급된다">위처럼 3, 5, 19, 231123은 <code>mod 2</code> 안에서는 같은 값으로 취급된다.</h4>
<h3 id="identity--inverse">Identity &amp; Inverse</h3>
<h4 id="identity-항등원--어떤-수에-어떠한-연산을-했을-때-처음과-동일한-수가-나오는-수">Identity (항등원) : 어떤 수에 어떠한 연산을 했을 때 처음과 동일한 수가 나오는 수</h4>
<ul>
<li><strong>덧셈에 대한 항등원 : 0</strong><blockquote>
<p>a + <strong><code>0</code></strong> = a
 x +  <strong><code>0</code></strong> = x</p>
</blockquote>
</li>
<li><strong>곱셈에 대한 항등원 : 1</strong><blockquote>
<p>a * <strong><code>1</code></strong> = a
 x *  <strong><code>1</code></strong> = x</p>
</blockquote>
</li>
</ul>
<h4 id="inverse-역원--어떤-수에-어떠한-연산을-했을-때-항등원이-나오는-수">Inverse (역원) : 어떤 수에 어떠한 연산을 했을 때 항등원이 나오는 수</h4>
<ul>
<li><strong>덧셈에 대한 역원</strong><blockquote>
<p>a + <strong><code>-a</code></strong> = 0
 x +  <strong><code>-x</code></strong> = 0</p>
</blockquote>
</li>
<li><strong>곱셈에 대한 역원</strong><blockquote>
<p>a * <strong><code>a^-1</code></strong> = 1
 x *  <strong><code>x^-1</code></strong> = 1</p>
</blockquote>
</li>
</ul>
<h4 id="mondular-연산에서-항등원과-등원">Mondular 연산에서 항등원과 등원</h4>
<ul>
<li><strong>덧셈에 대한 항등원</strong><blockquote>
<p><code>(a + 0) mod n</code> = <code>a mod n</code>
  <code>(x + 0) mod n</code> = <code>x mod n</code></p>
</blockquote>
</li>
<li><strong>곱셈에 대한 항등원</strong><blockquote>
<p><code>(a * 1) mod n</code> = <code>a mod n</code>
  <code>(x * 1) mod n</code> = <code>x mod n</code></p>
</blockquote>
</li>
<li><strong>덧셈에 대한 역원</strong><blockquote>
<p><code>(a + -a) mod n</code> = <code>0 mod n</code>
  <code>(x + -x) mod n</code> = <code>0 mod n</code></p>
</blockquote>
</li>
<li><strong>곱셈에 대한 역원</strong>
<strong><em>모듈러 연산은 정수를 사용하므로 *<code>a = x mod n</code></em> 에서 a와 n의 최대공약수가 1인 경우에만 역원이 존재하고, 그렇지 않은 경우에는 역원이 존재하지 않는다.*</strong><blockquote>
<p>( 1 * x ) mod 3  = 1  ⇨ x = 1
( 2 * x ) mod 3  = 1  ⇨ x = 2
( 3 * x ) mod 3  = 1  ⇨ <em>x는 존재하지 않는다</em></p>
</blockquote>
</li>
</ul>
<hr>
<p>참고 : <a href="https://www.youtube.com/watch?v=MAd3IJEaMls">https://www.youtube.com/watch?v=MAd3IJEaMls</a></p>
]]></description>
        </item>
    </channel>
</rss>