एक वाइगेनियर सिफरटेक्स्ट को डिक्रिप्ट करें


28

Vigenère सिफर एक सरल बहु वर्णी सिफर है कि मूल रूप से कई सीज़र सिफर से एक लागू करने, एक कुंजी से था। मूल रूप से कुंजी के अक्षर इंगित करते हैं कि उपयोग करने के लिए वर्णमाला को स्थानांतरित कर दिया। उस छोर तक एक सरल उपकरण था, जिसे विगेनेयर स्क्वायर कहा जाता था :

यहाँ छवि विवरण दर्ज करें

यहां प्रत्येक पंक्ति एक अलग वर्णमाला है, जो कुंजी के संबंधित अक्षर से शुरू होती है। तब स्तंभों का उपयोग सिफर अक्षर को निर्धारित करने के लिए किया जाता है। डिक्रिप्शन बहुत ही फैशन में काम करता है, केवल इसके विपरीत।

मान लीजिए हम स्ट्रिंग को एन्क्रिप्ट करना चाहते हैं CODEGOLF। हमें भी एक कुंजी की आवश्यकता है। इस मामले में कुंजी होगी FOOBAR। जब कुंजी प्लेनटेक्स्ट से छोटी होती है तो हम इसे पुनरावृत्ति द्वारा बढ़ाते हैं, इसलिए वास्तविक कुंजी जिसका हम उपयोग करते हैं FOOBARFO। अब हम कुंजी का पहला अक्षर देखते हैं, जिसे Fवर्णमाला खोजना है। यह शुरू होता है, शायद अनिश्चित रूप से, के साथ F। अब हम कॉलम को प्लेनटेक्स्ट के पहले अक्षर से देखते हैं और परिणामी अक्षर है H। दूसरे पत्र के लिए हमारे पास Oप्रमुख पत्र और सादे पाठ पत्र हैं, जिसके परिणामस्वरूप C। इस तरह से आगे बढ़ते हुए आखिरकार हम प्राप्त करते हैं HCRFGFQT

कार्य

आपका काम अब संदेशों को समझना है, एक कुंजी दी गई है। हालाँकि, जब से हम 16 वीं सदी से आगे निकल चुके हैं और हमारे पास कंप्यूटर हैं, हमें कम से कम थोड़ी बड़ी वर्णमाला का समर्थन करना चाहिए:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

विगेनेयर वर्ग का निर्माण अभी भी बहुत समान है और सिफर अभी भी उसी तरह से काम करता है। यह बस थोड़ा सा है ... पूर्ण रूप से यहाँ देने के लिए तैयार नहीं है।

इनपुट

इनपुट मानक इनपुट पर पाठ की दो अलग-अलग लाइनों के रूप में दिया जाता है, प्रत्येक को एक पंक्ति विराम द्वारा समाप्त किया जाता है। पहली पंक्ति में कुंजी होती है जबकि दूसरी में सिफरटेक्स्ट होता है।

उत्पादन

एक एकल पंक्ति, जिसमें डिकिफ़र्ड संदेश होता है।

जीतने की स्थिति

चूंकि एन्क्रिप्शन को कभी-कभी एक हथियार के रूप में माना जाता है, आसान तस्करी की सुविधा के लिए कोड छोटा होना चाहिए। जितना छोटा होगा, यह खोज की संभावना को कम करता है।

नमूना इनपुट 1

Key
miQ2eEO

नमूना उत्पादन 1

Message

नमूना इनपुट 2

ThisIsAKey
CoqKuGRUw29BiDTQmOpJFpBzlMMLiPb8alGruFbu

नमूना आउटपुट 2

ThisWorksEquallyWellWithNumbers123894576

एक हफ्ता बीत गया। वर्तमान में सबसे छोटा समाधान स्वीकार कर लिया गया है। रुचि रखने वालों के लिए, हमारी प्रतियोगिता में हमारे पास निम्न प्रस्तुतियाँ और लंबाई थीं:

130 - पायथन
146 - हास्केल
195 - सी
197 - सी
267 - वीबी.नेट

और हमारे अपने समाधान जो दूसरों के साथ रैंक नहीं किए गए थे:

108 - रूबी
139 - पॉवरशेल


ऐसा लगता है कि यह Vigenère स्क्वायर को प्रिंट करने के लिए उपयोगी हो सकता है।
को आउटगॉल्फ

जवाबों:


10

गोल्फस्क्रिप्ट - 48 वर्ण

n%~.,@*\{\(123,97>91,65>+58,48>+:|?@|?\-|=}%\0<+

इसमें कोई चालाकी नहीं!


+1 मैं यह सोचकर बिस्तर पर गया कि इसे नीचे ले जाने का एक तरीका है ~ 50, अब मैं इसे देखता हूं लेकिन यह संभव है कि मैं जल्द ही इसे किसी भी समय प्रबंधित नहीं कर
पाऊंगा

8

MS-DOS 16bit .COM फ़ाइल - 87 बाइट्स

बेस 64 एनकोडेड बाइनरी ( डिकोडर के लिए इस लिंक का अनुसरण करते हुए )

v1cBi8/oQACJ/ovv6DkAi9msitAqF3MDgMI+gMJhgPp6dguA6jqA+lp2A4DqK80hO/d0IkM563TW69YsYXMIBCB9AgQrBBqqtAHNITwNdev+xLIKzSHD

आमतौर पर आप गोल्फ के लिए शॉर्ट सोर्स कोड खुद लिखते हैं। जबकि शायद असंभव नहीं है, मुझे किसी तरह इस पर संदेह है।
जॉय

@ जॉय: क्या, आपने कभी इनकोडिंग मशीन कोड के निर्देश नहीं दिए हैं! बस वे इन दिनों युवाओं को क्या सिखाते हैं! ;-)
स्किज़

Skizz: मैंने किया था। Base64 में नहीं, हालांकि;) (हमारे पास कुछ साल पहले एक वर्ग था जहां हमें कोडांतरक में सीमेंस 80C167 के लिए कार्यक्रम लिखना था - और परीक्षा में उन्हें मशीन कोड में भी इकट्ठा किया गया था। मैंने असेंबलर के लिए उस ज्ञान को खोदने के बारे में सोचा था। बहुत छोटा काम है, लेकिन हमारे पास कोई आउटपुट सुविधाएं नहीं थीं (कम से कम, वे विविध थे))।
जॉय

@ जॉय: बेस 64 इस साइट पर अन्य उपयोगकर्ताओं के लिए सिर्फ एक सुविधा है, इसे द्विआधारी फ़ाइल के रूप में डिकोड करना और सहेजना आसान है (उत्तर में लिंक के पास वह विकल्प है)।
स्किज

आह, सॉरी। मुझे लगा कि आपने बेस 64 की लंबाई दी होगी। खैर, क्रिस ने एक बार एक समाधान में मनमाने पात्रों को शामिल किया और अपने जवाब के अलावा सिर्फ एक हेक्सडंप दिया। मैंने मौसम के पूर्वानुमान में भी ऐसा ही किया था।
जॉय

8

एपीएल (45)

∆[⍙⍳⍨¨⌽∘∆¨(⍴⍙←⍞)⍴1-⍨⍞⍳⍨∆←⎕D,⍨⎕A,⍨⎕UCS 96+⍳26]

स्पष्टीकरण:

  • ∆←⎕D,⍨⎕A,⍨⎕UCS 96+⍳26: वर्णमाला (संख्याएँ ⎕D) का पालन करें ( ⎕A) अक्षर लोअरकेस अक्षरों का पालन करें ( ⎕UCS 96+⍳26, यूनिकोड मान 97 से 122 तक)।

  • 1-⍨⍞⍳⍨∆: एक पंक्ति (कुंजी) पढ़ें, वर्णमाला में प्रत्येक वर्ण की स्थिति का पता लगाएं, और एक को घटाएं (सरणियां डिफ़ॉल्ट रूप से एक-आधारित हैं, इसलिए उन मानों द्वारा स्थानांतरण सीधे वर्णमाला को बहुत दूर स्थानांतरित कर देगा)।

  • (⍴⍙←⍞)⍴: दूसरी पंक्ति (संदेश) पढ़ें, और कुंजी के सूचक दोहराएं ताकि संदेश की लंबाई हो।
  • ⌽∘∆¨: कुंजी से संबंधित सूचकांकों द्वारा वर्णमाला को घुमाएं
  • ⍙⍳⍨¨: संदेश में प्रत्येक वर्ण को इसी स्थानांतरित वर्णमाला में देखें
  • ∆[... ]: सामान्य वर्णमाला में दिए गए सूचकांकों को देखें, जो संबंधित वर्ण देते हैं।

6

रूबी - 132 127 122 109 100 अक्षर

a,b=*$<
c=*?a..?z,*?A..?Z,*?0..?9
(b.size-1).times{|i|$><<c[c.index(b[i])-c.index(a[i%(a.size-1)])]}

एक और कुछ बाइट्स को बचाने के लिए लैम्ब्डा को इनलाइन *$<करने के बजाय उपयोग करें $<.to_a। - वेंटरो 5 मिनट पहले
जॉय

धन्यवाद @ जॉय, मैंने पात्रों को बचाने के लिए उस मेमने को बाहर निकाला और किसी तरह याद किया कि यह वास्तव में अधिक लागत है।
निमो 157

5

पायथन - 122 वर्ण

from string import*
L=letters+digits
R=raw_input
K,T=R(),R()
F=L.find
print"".join(L[F(i)-F(j)]for i,j in zip(T,K*len(T)))

5

जे, 65 वर्ण

v=:4 : 'a{~x(62|[:-/"1 a i.[,.#@[$])y[a=.a.{~62{.;97 65 48+/i.26'

इनपुट लेने के बजाय एक क्रिया के रूप में परिभाषित किए जाने के बाद से यह पूरी तरह से युक्ति से नहीं मिलता है, लेकिन मैं इसे बाद की तारीख में इसके साथ fiddling के इरादे से पोस्ट कर रहा हूं।

उपयोग:

   'miQ2eEO' v 'Key'
Message
   'CoqKuGRUw29BiDTQmOpJFpBzlMMLiPb8alGruFbu' v 'ThisIsAKey'
ThisWorksEquallyWellWithNumbers123894576

4

पर्ल, 95 चार्ट

पर्ल 5.010, साथ चलाएं perl -E:

%a=map{$_,$n++}@a=(a..z,A..Z,0..9);@k=<>=~/./g;
$_=<>;s/./$a[($a{$&}-$a{$k[$i++%@k]})%62]/ge;say

3

पायथन - 144 143 140 136 125 वर्ण

शायद सबसे अच्छा नहीं है, लेकिन हे:

from string import*
l=letters+digits
r=l.find
q=raw_input
k=q()
print"".join(l[(r(j)-r(k[i%len(k)]))%62]for i,j in enumerate(q()))

हुह, मैं कुछ ऐसा ही पोस्ट करने वाला था। आप raw_input को एक चर, 3 या इतने वर्णों में असाइन कर सकते हैं।
जुआन

3

गोल्फस्क्रिप्ट - 65 वर्ण

अभी भी और अधिक गोल्फ की जरूरत है। अभी के लिए, T पाठ है, K कुंजी है, L अक्षरों की सूची है

n%):T,\~*:K;''26,{97+}%+.{32^}%10,{48+}%++:L;T{L\?K(L\?\:K;-L\=}%

3

के, 81 61

k:0:0;,/$(m!+(`$'m)!+{(1_x),1#x}\m:,/.Q`a`A`n)[(#v)#k]?'v:0:0

k)k:0:0;,/$(m!+(`$'m)!+{(1_x),1#x}\m:,/.Q`a`A`n)[(#v)#k]?'v:0:0
ThisIsAKey
CoqKuGRUw29BiDTQmOpJFpBzlMMLiPb8alGruFbu
"ThisWorksEquallyWellWithNumbers123894576"

2

पर्ल, 115 वर्ण

$a=join'',@A=(a..z,A..Z,0..9);$_=<>;chop;@K=split//;$_=<>;s/./$A[(index($a,$&)-index($a,$K[$-[0]%@K]))%@A]/ge;print

2

गोल्फस्क्रिप्ट - 92 अक्षर

n%~\.,:l;{0\{1$+\)\}%\;}:&;26'a'*&26'A'*&+10'0'*&+\@.,,{.l%3$=4$?\2$=4$?\- 62%3$\>1<}%\;\;\;

शायद जितना होना चाहिए, उससे कहीं अधिक लंबा। फिर भी जीएस के आसपास मेरा सिर पाने की कोशिश कर रहा है।

Heres "ungolfed" और टिप्पणी संस्करण

n%~\.,:l;
{0\{1$+\)\}%\;}:&; # This would be sortof an equivalent for range applied to strings
26'a'*&26'A'*&+10'0'*&+\@., # This mess generates the dictionary string,
# l = len(key)
# 0 dictionary (letters + digits)
# 1 key
# 2 text
{
    # 3 index
    .   #+1 Duplicate the index

    # Find the index of the key letter
    l%  #+1 Indice modulo key
    3$  #+2 Duplicate the key
    =   #+1 Get the key letter
    4$? #+1 Search the letters index

    # Find the index of the text letter
    \   #+1 Get the index
    2$  #+2 Get the text
    =   #+1 Get the text letter
    4$? #+0 Search the letters index

    # 3 key index
    # 4 letter index

    \-   #+1 get the index of the new letter

    62% #+1 wrap the index around the dictionary

    3$ #+2 Get the dictionary

    \> #+1 remove the first part of the dict around the target letter

    1< #+1 remove everythin after 
}%
\;
\;
\;

2

VBA, 288

सूचीबद्ध VB.NET स्कोर को बहुत हरा नहीं करता (लेकिन मैं पास हो रहा हूं):

Sub h(k,s)
v=Chr(0)
Z=Split(StrConv("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",64),v)
a=Split(StrConv(s,64),v):b=Split(StrConv(k,64),v)
For l=0 To Len(s)-1
j=l Mod Len(k)
g=0
For i=0 To 62:g=g+i*((Z(i)=b(j))-(Z(i)=a(l))):Next
x=x &Z(IIf(g<0,g+62,g))
Next
s=x
End Sub

उपयोग:

Sub test()
k = "ThisIsAKey"
s = "CoqKuGRUw29BiDTQmOpJFpBzlMMLiPb8alGruFbu"
h k, s
MsgBox s
End Sub

टिप के लिए जॉय को धन्यवाद !


g=g+IIf(Z(i)=c,i,0)-IIf(Z(i)=d,i,0)मैं एक उम्मीदवार हो सकता हूं। साथ ही यह कोशिश करना कि क्या LF लाइन एंडिंग VBA द्वारा समझी जाती है। कम से कम एक जगह को x=x & Z(g)भी छोड़ा जा सकता है, मुझे लगता है।
जॉय

लाइन लिखने का दूसरा तरीका: g=g+i*((Z(i)=d)-(Z(i)=c)) (क्योंकि TrueVB में line1 है)। हो सकता है कि यह काम करता है।
जॉय

प्रतिक्रिया के लिए धन्यवाद, @ जॉय। मैं किसी भी अन्य सुधार के लिए
देखूंगा और उसको

2

सी, 186

थोड़ी देर लेकिन .. (क्षैतिज स्क्रॉलबार से बचने के लिए टूटी हुई रेखाएं)।

char a[99],*s,*t;k,j;main(int m,char**v)
{for(;j<26;++j)a[j]=32|(a[j+26]=65+j),
a[52+j]=48+j;while(*v[2])
putchar(a[s=strchr(a,v[1][k++%strlen(v[1])])
,t=strchr(a,*v[2]++),s>t?t-s+62:t-s]);}

अखंड रेखाएँ

char a[99],*s,*t;k,j;main(int m,char**v){for(;j<26;++j)a[j]=32|(a[j+26]=65+j),a[52+j]=48+j;while(*v[2])putchar(a[s=strchr(a,v[1][k++%strlen(v[1])]),t=strchr(a,*v[2]++),s>t?t-s+62:t-s]);}

इस कोड को हासिल करने की प्रक्रिया के बारे में एक चर्चा यहाँ मिल सकती है: http://prob-slv.blogspot.com/2013/04/code-golf.html


2

जावास्क्रिप्ट 248

var v= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
function d(k,c){var a,b,o,x
a=k.charAt(0)
x=v.indexOf(a)
b=v.substr(x)+v.substring(0,x)
o= v.charAt(b.indexOf(c.charAt(0)))
k=k.substr(1)+a
c=c.substr(1)
return (c)?o+d(k,c):o}

1

हास्केल (169)

import List
main=do c<-y;t<-y;putStrLn$map((k!!).(`mod`62))$zipWith(-)(g t)(cycle$g c)
k=['a'..'z']++['A'..'Z']++['0'..'9']
y=getLine
f(Just x)=x
g=map$f.(`elemIndex`k)

1

जे: 91 अक्षर

[:{&{.&t({&t"0&(({.t=.1|.^:(i.62)a.{~(97+i.26),(65+i.26),48+i.10)&i.)"0@:$~#)|:@(i."1.,"0)]

उदाहरण के लिए:

    g=:[:{&{.&t({&t"0&(({.t=.1|.^:(i.62)a.{~(97+i.26),(65+i.26),48+i.10)&i.)"0@:$~#)|:@(i."1.,"0)]
    'ThisIsAKey' g 'CoqKuGRUw29BiDTQmOpJFpBzlMMLiPb8alGruFbu'
ThisWorksEquallyWellWithNumbers123894576
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.