PKCS # 7 패딩 유효성 검증


25

암호화에서 PKCS # 7 패딩 은 N ≥ 1의 바이트 수를 더하는 패딩 방식이며, 추가 된 각 바이트의 값은 N과 같습니다.

예를 들어, Hello, World!13 바이트를 갖는는 16 진수로 다음과 같습니다.

48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

PKCS # 7 pad를 길이 16으로 선택하면 결과는 다음과 같습니다.

48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 03 03 03

그리고 우리가 길이 20으로 채우도록 선택하면 결과는 다음과 같습니다.

48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 07 07 07 07 07 07 07

첫 번째 예 03에서는 3 바이트를 추가하고 두 번째 예 에서는 7 07바이트를 추가 합니다.

당신의 작업은 문자열 (또는 정수 배열)이 올바른 PKCS # 7 패딩을 가지고 있는지 확인 하는 것 입니다. 즉, 입력 문자열의 마지막 바이트가 N이면 프로그램은 문자열의 마지막 N 바이트가 N과 같은지 확인해야합니다.

입력

코드 포인트 1과 127 사이의 문자를 포함하는 비어 있지 않은 단일 ASCII 문자열입니다. 원하는 경우 입력을 정수 배열로 대신 사용할 수 있습니다.

산출

truthy의 값이 입력 된 문자열이 유효 PKCS # 7 패딩 그렇지 falsy 값을 가지면.

기능과 전체 프로그램이 모두 허용됩니다. 이것은 이므로 코드의 바이트 수를 최소화하는 것이 목표입니다.

테스트 사례

입력의 정수 배열 버전이 여기에 표시됩니다. 다음과 같은 여러 테스트 사례에서 문자열 버전에 인쇄 할 수없는 문자가 있습니다.

진실한 :

[1]
[1, 1]
[2, 1]
[2, 2]
[5, 6, 5, 3, 3, 3]
[1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2]
[95, 115, 80, 32, 71, 7, 122, 49, 13, 7, 7, 7, 7, 7, 7, 7, 7]
[27, 33, 54, 65, 97, 33, 52, 55, 60, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
[15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]

거짓 :

[2]
[1, 2]
[5, 5, 5, 5]
[5, 6, 5, 4, 4, 4]
[3, 3, 3, 94, 3, 3]
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 127]
[50, 39, 94, 105, 49, 29, 74, 102, 2, 106, 44, 7, 7, 7, 7, 7, 7]
[26, 27, 59, 25, 122, 110, 20, 30, 114, 6, 9, 62, 121, 42, 22, 60, 33, 12]

[1 2 3 3 3 3]진실 인가 거짓 인가 ? 나는 그것이 진실해야 한다고 생각 하지만 나는 긍정적이지 않습니다.
DJMcMayhem

@DJMcMayhem Truthy
Jakube

@DJMcMayhem Truthy ( 7s로 끝나는 진실한 테스트 사례와 유사합니다 ). 스트리핑 후으로 끝나는 것으로 생각할 수 있습니다 [1 2 3].
Sp3000

반드시 Hello 뒤에 쉼표를 넣으십시오. (16 진수입니다.)
rici

@rici 고쳐 주셔서 감사합니다!
Sp3000

답변:


8

파이썬, 47 34 33 바이트

lambda s:s[-1:]*s[-1]==s[-s[-1]:]

s[-1]목록의 마지막 구성원입니다 s. s[-1]입력 배열 의 마지막 멤버 가 여러 번 반복 s된 배열과 같은지 확인합니다 s[-1].

입력을 정수 배열로 취합니다. 이것은 람다 식입니다. 사용하려면 앞에 접두사 lambda를 지정하십시오 f=.

Ideone에서 사용해보십시오!

테스트하려면 :

>>> f=lambda s:s[-1:]*s[-1]==s[-s[-1]:]
>>> f([27, 33, 54, 65, 97, 33, 52, 55, 60, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10])
True
>>> f([50, 39, 94, 105, 49, 29, 74, 102, 2, 106, 44, 7, 7, 7, 7, 7, 7])
False

Leaky Nun 덕분에 13 바이트를 절약했습니다!

Dennis 덕분에 바이트를 절약했습니다!


def f(s)=바이트가 짧습니다.
ThreeFx

2
@ThreeFx 귀국해야합니까?
Leaky Nun

@ThreeFx 예,하지만을 써야 return합니다. lambda버전은 7 바이트 짧습니다.
구리

네가 옳아. 죄송합니다.
ThreeFx

lambda s:[s[-1]]*s[-1]=s[-s[-1]:]
Leaky Nun


7

Pyth, 5 바이트

gFer8

입력시 RLE는 마지막 쌍을 취하고 반복 횟수가 값보다 크거나 같은지 확인하십시오.

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트


7

젤리 , 5 바이트

ŒgṪṫṪ

입력은 코드 포인트의 배열이며 출력은 비어 있지 않은 배열 (거짓) 또는 빈 배열 (거짓)입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

ŒgṪṫṪ  Main link. Argument: A (array)

Œg     Group all runs of consecutive, equal integers.
  Ṫ    Tail; yield the last run. It should consist of n or more occurrences of n.
    Ṫ  Tail; yield n, the last element of A.
   ṫ   Dyadic tail; discard everything after the n-th element of the last run.
       If the last run was long enough, this will yield a non-empty array (truthy);
       if not, the result will be an empty array (falsy).

6

CJam, 9 8 바이트

1 바이트를 절약 한 Sp3000에 감사합니다.

{e`W=:/}

정수 목록을 입력으로 취하고 0(거짓) 또는 양의 정수 (거짓)를 반환합니다 .

테스트 스위트.

설명

e`   e# Run-length encoding, yielding pairs of run-length R and value V.
W=   e# Get the last pair.
:/   e# Compute R/V, which is positive iff R ≥ V. Works, because V is guaranteed
     e# to be non-zero.

6

05AB1E , 9 바이트

osabie에 대한 실행 길이 인코딩이 없습니다. (

¤sR¬£¬QOQ

설명:

¤           # Get the last element of the array
 s          # Swap the two top elements
  R         # Reverse the array
   ¬        # Get the first element
    £       # Substring [0:first element]
     ¬      # Get the first element
      Q     # Check if they are equal
       OQ   # Sum up and check if equal

예를 들면 다음과 같습니다.

¤           # [5, 6, 5, 3, 3, 3]  3
 s          # 3  [5, 6, 5, 3, 3, 3]
  R         # 3  [3, 3, 3, 5, 6, 5]
   ¬        # 3  [3, 3, 3, 5, 6, 5]  3
    £       # 3  [3, 3, 3]
     ¬      # 3  [3, 3, 3]  3
      Q     # 3  [1, 1, 1]
       OQ   # 3==3 which results into 1

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


5

MATL , 10 바이트

이전 버전의 코드에서 문제를 발견 한 @Adnan에게 감사합니다.

P0hG0):)&=

입력이 올바른 패딩을 갖는 경우, 출력은들만을 포함하는 배열이다 truthy이 . 잘못된 패딩이 있으면 출력은 적어도 0을 포함하는 배열이므로 거짓 입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

P     % Implicitly take numeric array as input. Reverse the array
0h    % Append a 0. This ensures falsy output if input array is too short
G0)   % Push input again. Get its last element
:     % Range from 1 to that
)     % Apply as index into the array
&=    % 2D array of all pairwise equality comparisons. Implicitly display

지금 @Adnan 작업
루이스 Mendo

좋은, 좋아 보인다 :)
Adnan

2
또한 25k 축하합니다! : 3
Adnan

4

매스 매 티카, 29 바이트

#&@@#<=Length@#&@*Last@*Split

입력을 동일한 요소의 런으로 분할하고 마지막 요소를 추출한 후 첫 번째 요소가 해당 런의 길이보다 작거나 같은지 확인하십시오.


3

하스켈, 50 바이트

import Data.List
((>=)<$>head<*>length).last.group

정수 배열을 입력으로받습니다.


REPL에 있지 않으면 Data.List를 가져와야합니다.
xnor

2

J, 13 바이트

#~@{:-:{:{.|.

목록을 단일 인수 1로 가져 와서 진실되고 거짓이면 출력 합니다 0.

용법

   f =: #~@{:-:{:{.|.
   f 5 6 5 3 3 3
1
   f 5 6 5 4 4 4
0

설명

#~@{:-:{:{.|.  Input: array A
           |.  Reverse A
       {:      Get the last value in A
         {.    Take that many values from the reverse of A
   {:          Get the last value in A
#~@            Make a list with that many copies of the last value
     -:        Test if the list of copies matches the sublist of A and return

@randomra 케이스 같은 3 4 3 3 3~.같은 3 4정도의 마지막 행이 있다는 =것입니다 0 1 0 0 0. 나는 반대로 작동하는 {:*/@{.0{=@|.것이 작동해야 한다고 생각 하지만 결국 13 바이트로 끝납니다.
마일

맞아요 나는 그것을 놓쳤다.
randomra

2

Brain-Flak , 54 바이트

(({})[()]){({}[()]<({}[({})]){<>}{}>)}{}{<>(<(())>)}{}

입력은 정수 목록이며 출력은 1은 진위이고, 1은 거짓입니다.

설명

(({})[()]){ Loop a number of times equal to the last integer in the input - 1
    ({}[()] Handle loop counter
        < Silently...
            ({}[({})]) Replace the last code point in the string with its difference with the code point before it
            {<>} If the difference is not zero then switch stacks
            {} Discard the difference
        > End silently
    ) Handle loop counter
} End loop
{} Discard the loop counter
{<>(<(())>)} If the top of the current stack is not 0 (which means we have not switched stacks push 0 then 1
{} Discard the top of the stack (either nothing if falsey or 0 if truthy)

잘못된 반환을 초래하는 값이 발생하면 루프가 즉시 종료되지 않습니다. 대신 비어있는 다른 스택으로 전환되고 나머지 반복은 0과 0을 비교합니다.


1
오, 여기에서 만나서 반가워요! 사이트에 오신 것을 환영합니다!
DJMcMayhem

1

배치, 101 바이트

@for %%a in (%*)do @set/an=%%a,c=0
@for %%a in (%*)do @set/ac+=1,c*=!(n-%%a)
@if %c% geq %n% echo 1

입력을 명령 행 매개 변수로 취하고, 마지막 매개 변수를 가져올 수 있도록 모든 매개 변수를 반복하고 n, 후행 실행을 계산하기 위해 모든 매개 변수를 다시 반복하고 n, 마지막으로 1수가 적어도 같으면 인쇄 합니다 n. 또는 인쇄 0또는 0이 아닌 값이 허용되는 경우 93 바이트의 경우 마지막 행을로 변경하십시오 @cmd/cset/ac/n.




1

자바 스크립트 (ES6), 51 47 41 바이트

a=>(r=k=>a.pop()^n?k<2:r(k-1))(n=a.pop())

예 :

let f =
a=>(r=k=>a.pop()^n?k<2:r(k-1))(n=a.pop())

console.log(f([5, 6, 5, 3, 3, 3]))
console.log(f([5, 6, 5, 4, 4, 4]))


1

C 91 바이트

int f(int*l){int n;for(n=0;l[++n];);l+=n-1;for(int i=*l;i;)if(l[-i--+1]^*l||n<*l)return 0;}

입력 : null로 끝나는 배열에 대한 포인터.
출력 : 반환0 유효하지 않은 패딩을 하고 유효하지 않은 값을 합니다 (배열의 마지막 요소).

예 :

int a[] = {5, 6, 5, 3, 3, 3, 0};
printf("%d\n", f(&a[5], 6));

int b[] = {1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 0};
printf("%d\n", f(&b[11],12 ));

int m[] = {5, 6, 5, 4, 4, 4, 0};
printf("%d\n", f(&m[5], 6));

int n[] = {3, 3, 3, 94, 3, 3, 0};
printf("%d\n", f(&n[5], 6));

제공합니다 :

3
2
0
0

이것은 정의되지 않은 동작에 의존합니다. 패딩이 유효하면 return 문 gcc -std=c99이 없지만 이것을 사용 하면 (적어도 내 컴퓨터에서) 전달 된 배열의 마지막 요소를 반환합니다.



1

Brachylog , 6 바이트

a₁=.l∈

온라인으로 사용해보십시오!

Leaky Nun의 Brachylog v1 답변과 같이 술어 성공 또는 실패를 통해 출력합니다. 비슷한 접근 방식을 취하지 만 훨씬 짧아집니다.

a₁        There exists a suffix of the input
  =       the elements of which are all equal
   .      which is the output variable
    l     the length of which
     ∈    is an element of
          the output variable.

Brachylog , 6 바이트

ḅt.l≥∈

온라인으로 사용해보십시오!

Dennis 'Jelly의 답변에서 영감을 얻은 동일한 길이의 대체 버전입니다.

 t        The last
ḅ         block of consecutive equal elements of the input
  .       is the output variable
   l      the length of which
    ≥     is greater than or equal to
     ∈    an element of
          the output variable.

0

망막 , 34 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

.+
$*
\b(1(1)*)(?<-2>¶\1)*$(?(2)!)

입력은 줄 바꿈으로 구분 된 정수 목록입니다. 인쇄 0또는 1.

온라인으로 사용해보십시오!첫 번째 라인은 라인 당 하나의 공백으로 분리 된 테스트 케이스가있는 테스트 스위트를 사용합니다.

35 바이트로 끝나고 인쇄 0되거나 양의 정수로 대체되는 대체 아이디어 :

.+
$*
\b(?=(1+)(¶\1)*$)(?<-2>1)*1\b


0

자바 스크립트 (ES5), 89 바이트

function(b){for(var d=b[b.length-1],c=0;c<d;c++)if(b[b.length-c-1]!=d)return!1;return!0};

언 골프 드 :

function a(arr){
var b=arr[arr.length-1];
for(var i=0;i<b;i++){
    if(arr[arr.length-i-1]!=b)return false;
}
return true;
}

0

Brain-Flak 84 바이트

100000000는 나를 이길 여기

온라인으로 사용해보십시오!

((({}))){({}[()]<(({})<([{}]{}<>)<>>)>)}<>([])({<{}>{}<([])>}{}<(())>){((<{}{}>))}{}

정수 배열로 입력을받습니다.

올 설명.

다음은 답이 아닌 것을 출력하는 64 바이트 버전입니다.

((({}))){({}[()]<(({})<([{}]{}<>)<>>)>)}<>([])({<{}>{}<([])>}{})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.