Validasi padding PKCS # 7

25

Dalam kriptografi, padding PKCS # 7 adalah skema padding yang menambahkan sejumlah byte N ≥ 1, di mana nilai setiap byte yang ditambahkan sama dengan N.

Misalnya,, Hello, World!yang memiliki 13 byte, adalah yang berikut dalam hex:

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

Jika kita memilih pad PKCS # 7 dengan panjang 16, maka hasilnya adalah:

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

Dan jika kita memilih untuk mengisi panjang 20, maka hasilnya adalah:

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

Perhatikan bahwa pada contoh pertama kita menambahkan tiga 03byte, dan yang kedua kita tambahkan tujuh 07byte.

Tugas Anda adalah memvalidasi apakah string (atau array integer) memiliki padding PKCS # 7 yang benar. Artinya, jika byte terakhir dari string input adalah N, maka program Anda harus memeriksa bahwa N byte terakhir dari string sama dengan N.

Memasukkan

String ASCII nonempty tunggal yang mengandung karakter antara titik kode 1 dan 127 inklusif. Jika mau, Anda dapat mengambil input sebagai array bilangan bulat.

Keluaran

Sebuah truthy nilai jika input string memiliki PKCS valid # 7 padding, jika nilai falsy.

Fungsi dan program lengkap dapat diterima. Ini adalah , jadi tujuannya adalah untuk meminimalkan jumlah byte dalam kode Anda.

Uji kasus

Versi input integer array disajikan di sini - versi string akan memiliki karakter yang tidak dapat dicetak untuk banyak kasus uji berikut:

Benar:

[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]

Falsy:

[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]
Sp3000
sumber
Apakah benar [1 2 3 3 3 3]atau salah? Saya pikir itu harus benar tetapi saya tidak positif.
DJMcMayhem
@DJMcMayhem Truthy
Jakube
@DJMcMayhem Truthy (paralel dengan kasus uji kebenaran yang berakhir dengan 7s). Anda dapat menganggapnya sebagai, setelah stripping, Anda akan berakhir dengan [1 2 3].
Sp3000
Tentunya Anda bermaksud membuat koma setelah Halo. (Ada di hex.)
rici
@rici Terima kasih telah memperhatikan, memperbaiki!
Sp3000

Jawaban:

8

Python, 47 34 33 byte

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

s[-1]adalah anggota terakhir dari daftar s. Memeriksa bahwa s[-1]anggota terakhir dari array input ssama dengan array s[-1]berulang yang berkali-kali.

Mengambil input sebagai array bilangan bulat. Ini adalah ungkapan lambda; untuk menggunakannya, tetapkan dengan awalan lambdadengan f=.

Cobalah di Ideone!

Untuk menguji:

>>> 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

Disimpan 13 byte berkat Leaky Nun!

Menyimpan satu byte berkat Dennis!

Tembaga
sumber
def f(s)=byte lebih pendek.
ThreeFx
2
@ Tiga Tiga Anda harus kembali?
Leaky Nun
@ThreeFx Ya, tapi kemudian saya harus menulis return. The lambdaversi 7 byte lebih pendek.
Tembaga
Kamu benar. Maaf.
ThreeFx
lambda s:[s[-1]]*s[-1]=s[-s[-1]:]
Leaky Nun
7

Brachylog , 14 byte

~c[A:B]t#=h~lB

Cobalah online!

~c[A:B]t#=h~lB
~c[A:B]                input is concatenation of A and B
       t               B
        #=             has all equal elements
          h~lB         the first item of B is the length of B
Biarawati Bocor
sumber
7

Pyth, 5 byte

gFer8

RLE pada input, ambil pasangan terakhir dan periksa apakah jumlah pengulangan lebih besar atau sama dari nilainya.

Cobalah online: Demonstrasi atau Test Suite

Jakube
sumber
7

Jelly , 5 byte

ŒgṪṫṪ

Input adalah array dari titik kode, output adalah array yang tidak kosong (kebenaran) atau array kosong (palsu).

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Œ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).
Dennis
sumber
6

CJam, 9 8 byte

Terima kasih kepada Sp3000 untuk menghemat 1 byte.

{e`W=:/}

Mengambil daftar bilangan bulat sebagai input dan pengembalian 0(falsy) atau bilangan bulat positif (kebenaran).

Suite uji.

Penjelasan

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.
Martin Ender
sumber
6

05AB1E , 9 byte

Tidak ada penyandian run-length untuk osabie :(

¤sR¬£¬QOQ

Penjelasan:

¤           # 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

Dengan sebuah contoh:

¤           # [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

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
5

MATL , 10 byte

Terima kasih kepada @Adnan karena melihat masalah dengan versi kode yang lebih lama

P0hG0):)&=

Ketika input memiliki bantalan yang benar, output adalah array yang berisi hanya orang-orang, yang truthy . Ketika memiliki padding yang salah, output adalah array yang mengandung setidaknya nol, dan juga palsu .

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
Luis Mendo
sumber
@ Adnan Bekerja sekarang
Luis Mendo
Bagus, terlihat bagus :)
Adnan
2
Juga, selamat atas 25k! : 3
Adnan
4

Mathematica, 29 byte

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

Pisahkan input ke dalam run dari elemen yang sama, ekstrak yang terakhir, dan periksa bahwa elemen pertama kurang dari atau sama dengan panjang run itu.

Martin Ender
sumber
3

Haskell, 50 byte

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

Mengambil array bilangan bulat sebagai input.

ThreeFx
sumber
Anda perlu mengimpor Data.List kecuali Anda berada di REPL.
xnor
2

J, 13 byte

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

Membawa daftar sebagai argumen tunggal dan menghasilkan 1jika itu benar dan 0jika palsu.

Pemakaian

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

Penjelasan

#~@{:-:{:{.|.  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
mil
sumber
@randomra Kasus seperti 3 4 3 3 3akan ~.sebagai 3 4sehingga baris terakhir =adalah 0 1 0 0 0. Saya pikir beroperasi pada kebalikannya seperti yang {:*/@{.0{=@|.seharusnya bekerja, tetapi berakhir sebagai 13 byte juga.
mil
Benar, tangkapan yang bagus. Saya melewatkan itu.
randomra
2

Brain-Flak , 54 byte

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

Input adalah daftar bilangan bulat, output adalah 1 untuk truey dan kosong untuk falsey.

Penjelasan

(({})[()]){ 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)

Loop tidak segera berakhir ketika nilai yang akan menghasilkan pengembalian falsey ditemui. Alih-alih beralih ke tumpukan lain yang kosong dan menghabiskan sisa iterasi membandingkan 0 dan 0.

0 '
sumber
1
Oh hei, senang melihatmu di sini! Selamat datang di situs ini!
DJMcMayhem
1

Batch, 101 byte

@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

Mengambil input sebagai parameter baris perintah, lilitkan semuanya sehingga bisa masuk yang terakhir n, lilitkan semua untuk menghitung run dari trailing n, akhirnya mencetak 1jika jumlah paling tidak sama dengan n. Atau jika pencetakan 0atau nilai bukan nol dapat diterima, maka untuk 93 byte, ubah baris terakhir menjadi @cmd/cset/ac/n.

Neil
sumber
1

Haskell, 49 byte

f s|x<-(==last s)=x.length.fst.span x.reverse$s

Cobalah di Ideone.

Versi lebih pendek yang mengembalikan Truekebenaran dan Falseatau pengecualian untuk kepalsuan:

((==).head>>=all).(head>>=take).reverse
Laikoni
sumber
1

Dyalog APL , 10 byte

(⊃∧.=⊃↑⊢)⌽

Adalah yang pertama
∧.=semua-sama dengan
pertama
n diambil dari
para
argumen terbalik?

TryAPL online!

Adám
sumber
2
Berapa byte?
Conor O'Brien
@ ConorO'Brien Maaf, lupa mengisi boilerplate.
Adám
1

Javascript (ES6), 51 47 41 byte

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

Contoh:

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]))

Arnauld
sumber
1

C 91 Bytes

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;}

Input: pointer ke array yang diakhiri null.
Output: pengembalian 0untuk padding tidak valid dan non-nol untuk valid (elemen terakhir dalam array)

Contoh:

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));

Memberi:

3
2
0
0

Ini bergantung pada perilaku yang tidak terdefinisi. Jika padding valid tidak ada pernyataan kembali, tetapi menggunakan gcc -std=c99ini mengembalikan elemen terakhir dari array yang dilewatkan (setidaknya pada mesin saya).

Riley
sumber
1

Brachylog , 6 byte

a₁=.l∈

Cobalah online!

Keluaran melalui keberhasilan atau kegagalan predikat, seperti yang dilakukan oleh Brachylog v1 Leaky Nun. Mengambil pendekatan yang sama, juga, tetapi keluar jauh lebih pendek.

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 byte

ḅt.l≥∈

Cobalah online!

Versi alternatif yang keluar dengan panjang yang sama yang mengambil beberapa inspirasi dari jawaban 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.
String yang tidak terkait
sumber
0

Retina , 34 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

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

Input adalah daftar bilangan bulat yang dipisahkan baris-umpan. Cetakan 0atau 1.

Cobalah online! (Baris pertama memungkinkan suite uji, di mana ada satu test case yang dipisahkan ruang per baris.)

Gagasan alternatif yang berakhir pada 35 byte dan cetakan 0atau bilangan bulat positif:

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

Pyke, 7 byte

eQ>}lt!

Coba di sini!

Biru
sumber
0

Javascript (ES5), 89 byte

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};

Tidak Disatukan:

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;
}
Paul Schmitz
sumber
0

Brain-Flak 84 byte

100000000 mengalahkan saya di sini

Cobalah secara Online!

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

Mengambil input sebagai array bilangan bulat.

Penjelasan yang akan datang.

Berikut adalah versi 64 byte yang menghasilkan yang bukan dari jawabannya:

((({}))){({}[()]<(({})<([{}]{}<>)<>>)>)}<>([])({<{}>{}<([])>}{})
Wisaya Gandum
sumber