2016-11-19 8 views
0

C++에서 AES 암호화를 실험하고 있는데 GitHub에서 AES 구현을 찾았습니다. 문제는 입력 바이트 배열의 크기가 16으로 나눌 수 있어야하고 데이터가 대다수의 시간에이 요구 사항을 충분히 채울 수 없다는 것입니다. 크기가 16으로 나눌 수있을 때까지 패딩 (배열 끝에 0-s)을 추가하려고합니다.C++에서 BYTE 배열에 패딩을 추가하는 방법은 무엇입니까?

가장 가까운 크기를 계산하는 함수가 있지만 패딩을 배열에 추가하는 방법을 모르겠습니다. .

PBYTE AddPadding(PBYTE Array, int size) 
{ 
    if (size % 16 != 0) 
    { 
     size += (16 - size % 16); 
     size = ceil(size/16) * 16; 
    } 

    BYTE* tmp = new BYTE[size]; 

    //the magic should happen here 

    return tmp; 
} 

의 입력 및 호출은 다음과 같습니다

BYTE in[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 
     0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 
     0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 
     0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10, 0x25 }; 

PBYTE tmp = AddPadding(in, sizeof(in)); 
+0

배열 바로 다음의 바이트를 사용하지 않는다고 가정 할 수 없습니다. 이렇게하면 배열에 대한 포인터를 포인터로 전달하고 적절한 크기의 새 배열을 할당하고 (오류 처리) 내용을 새 배열에 복사하고 0을 추가하고 원래 배열을 해제해야합니다 , 새로운 배열을 돌려줍니다. 분명히 이는 비효율적이며 실패 할 수 있습니다. 원본 배열을 그대로 처리하고 마지막 반복에서 가상 0을 추가하는 것이 좋습니다. –

+0

암호화시 패딩 추가를 처리하고 암호 해독시 라이브러리를 제거하는 라이브러리를 사용하면 매우 일반적입니다. 일반적으로 옵션이 있으며 기본값은 여러 번입니다. 구현이 다른 라이브러리를 찾는 것을 지원하지 않는 경우. – zaph

답변

1

대부분의 암호 라이브러리는 당신을 위해 패딩을 추가합니다. 만약 당신이 직접하고 싶다면 :

  1. 얼마나 많은 패딩이 필요한지 계산하십시오.

  2. C 배열은 확장 할 수 없으므로 일반 텍스트와 패딩을 모두 유지하려면 새 배열을 만들어야합니다.

  3. PKCS#7 패딩은 일반적인 것이므로 그렇게하지 않는 한 선택하십시오.

  4. 평문과 패딩을 새 배열에 복사하십시오.

  5. 암호화를 위해 AES에 새 배열을 전달하십시오. 이제는 블록으로 균등하게 나눌 수 있습니다.

  6. 암호 해독시 패딩이 있고 올바르게 형성되어 있는지 확인하십시오. 잘못된 패딩은 문제가 있음을 나타냅니다.

  7. 패딩을 제거하고 암호 해독 된 텍스트를 반환하십시오.