VIC şifre şimdiye kadar tasarladığı en komplike kalem ve kağıt şifrelerin biridir. 1950'lerde Sovyet casusu Reino Häyhänen tarafından "VICTOR" kod adı ile kullanıldığında, ana prensibi gizleme yoluyla güvenliktir; bir sürü şaşkınlık.
Göreviniz, bir mesaj alacak ve VIC şifresini kullanarak kodlayacak bir program veya işlev yazmaktır. Ayrıca burada bir VIC şifre çözücü meydan okuması da gönderdim . Aşağıdaki talimatlardan herhangi biri net değilse, yorumlarda bunları sormaktan çekinmeyin. Talimatlar bu siteden uyarlanmıştır .
VIC şifresini kodlama
Hazırlık
Beş girişe ihtiyacınız olacak:
- düz metin mesajı
- kendi dilinizde en sık kullanılan harfleri içeren kısa bir anahtar kelime veya kelime öbeği
- bir alıntı veya bir şarkıdan bir satır gibi bir anahtar kelime (en az 20 karakter)
- bir tarih (veya altı veya daha fazla basamaklı başka bir sayı)
- kişisel temsilci numarası
Uygulamada, bu son dördü, gönderenin veya alıcının temsilci numarasının kodlamada kullanılıp kullanılmadığı da dahil olmak üzere, önceden gönderen ve alıcı tarafından kararlaştırılmalıdır.
Örnek mesajım şöyle olacak: We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
İngilizce kodlayacağız (tercih ettiğiniz dil ve alfabeyi kullanabilirsiniz) ve İngilizce alfabedeki en yaygın harfler A, E, I, N, O, R, S, T
. Anahtar kelimeyi kullanacağım SENATORI
.
Anahtar ifadem Richard Feynman'ın bir alıntısı: "İlk ilke kendinizi kandırmamalısınız - ve kandırmak için en kolay kişi sizsiniz."
Tarih olarak, 31 Temmuz 2016 (biçiminde 3172016
) kullanacağım, bu açıklamayı yazdığım gün.
Kendim için seçtiğim kişisel numara 9
.
Adımların özeti
- Aşağıdaki adımlarda kullanmak üzere ara anahtarları türetin.
- Kaideli dama tahtası inşa edin ve uygulayın.
- İlk transpozisyon tablosunu oluşturun ve uygulayın.
- İkinci (bozulmuş) transpozisyon tablosunu oluşturun ve uygulayın.
- Mesaj gösterge grubunu ekleyerek mesajı sonlandırın.
Submechanisms
Maddenin etine girmeden önce açıklanması gereken iki şey daha: zincir ekleme ve sıralılaştırma süreçleri.
Gecikmeli bir Fibonacci jeneratörü olarak da bilinen zincir eklenmesi, bir başlangıç rakamı dizisi alarak, ilk iki haneyi taşımadan (daha sonra birleştirin mod 10
) ekleyerek ve sonucu sonuna ekleyerek çalışır. Örneğin:
79081
7 + 9 = 6
790816
9 + 0 = 9
7908169
0 + 8 = 8
79081698
8 + 1 = 9
790816989
1 + 6 = 7
7908169897
... and so on
Sıralılaştırma esasen bir dizi harf veya rakam almak ve bunları alfabetik / sayısal sıralarına göre etiketlemektir. Kopyalar soldan sağa olarak etiketlenir. Örneğin:
E X A M P L E
0 # A
1 0 2 # Es
1 0 3 2 # L
1 0 4 3 2 # M
1 0 4 5 3 2 # P
1 6 0 4 5 3 2 # X
3 3 0 5 8 4 2 0 4 7 5 4 8 1
0 1 # 0s
0 1 2 # 1
0 3 1 2 # 2
4 5 0 3 1 2 # 3s
4 5 0 6 3 1 7 8 2 # 4s
4 5 0 9 6 3 1 7 10 8 2 # 5s
4 5 0 9 6 3 1 7 11 10 8 2 # 7
4 5 0 9 12 6 3 1 7 11 10 8 13 2 # 8s
Burada sıfır endeksleme kullanıyorum, ancak istediğiniz gibi indeks.
1. Ara Tuşlar
10 iki gruba anahtar cümlenin ilk 20 harf Split ve biz arayacak olan tek tek her sequentialize S1
ve S2
.
THEFIRSTPR
S1: 8201357946
INCIPLEIST
S2: 2603751489
Rastgele 5 basamaklı bir mesaj tanımlayıcı seçin, M
(isterseniz bu girişlerden biri olabilir):
M = 47921
(Çıkarma borçlanma olmadan çıkarma mod 10
,) tuşuna tarihi ilk beş basamak 3172016
arasından M
:
M 47921
date - 31720
= 16201
Zincir, on basamağınız olana kadar sonucu ekleyin:
1620178218
Bu rakamları elde etmek için S1
taşımadan veya mod 10
elde etmek için ekleyin G
:
1620178218
S1 + 8201357946
G = 9821425154
Yukarıda S2
, 0123456789 dizisini yazın. 0123456789 dizisindeki her bir basamağını bulun G
ve yerine doğrudan altındaki basamakla değiştirin S2
. Sonuç T
.
0123456789
S2 2603751489
G 9821425154
T 9806705657
T
60 basamağa kadar genişletmek için zincir eklemeyi kullanın .
9806705657
becomes
980670565778637511245490262369939288595822106344304316978734
Bu son 50 basamak, her biri on basamaklı beş sıra halinde U
bloğu oluşturur.
T 9806705657
U 7863751124
5490262369
9392885958
2210634430
4316978734
U
Bloğun eşit olmayan son iki basamağı , iki dönüşümün genişliğini vermek için ajanın kişisel numarasına ayrı ayrı eklenir p
ve q
.
9 + 3 = 12 (p, ilk transpozisyon genişliği) 9 + 4 = 13 (q, ikinci transpozisyon genişliği)
Sıralı hale getirin T
ve U
bloğun sütunlarını yukarıdan aşağıya doğru yeni bir basamak sırasına kopyalamak için sıralayın ve kullanın V
.
T 9806705657
seqT 9804612537
U 7863751124
5490262369
9392885958
2210634430
4316978734
V 69911 56837 12548 26533 30206 13947 72869 49804 84323 75924
p
İlk transpozisyonun anahtarını almak için ilk rakamları ve ikinci transpozisyonun tuşunu K1
takip eden q
rakamları sıralayın K2
.
First 12 6 9 9 1 1 5 6 8 3 7 1 2
K1 6 10 11 0 1 5 7 9 4 8 2 3
Next 13 5 4 8 2 6 5 3 3 3 0 2 0 6
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
Son olarak, U
almak için bloğun son sırasını sıralı olarak, sıralı C
dama tahtası için sütun başlıklarını sıralayın:
U5 4316978734
C 3105968724
2. Çifte Dama Tahtası
İlk olarak, örnek dama tahtasımı vereceğim, daha sonra bu şekilde oluşturmanın ilkelerini açıklayacağım:
3 1 0 5 9 6 8 7 2 4
S E N A T O R I
2 B D G J L P U W Y .
4 C F H K M Q V X Z #
İlk harf satırı kısa anahtar kelimemizdir SENATORI
. Anahtar kelimeniz yinelenmeyen herhangi bir dize olabilir, ancak dama tahtanızın en üst satırını tanımladığından akıllıca seçin. Anahtar kelimenin üstünde C
ve diğer satırlar seçtiğiniz sırayla alfabenizin geri kalan kısmıdır. Benim durumumda, dama tahtasını Latin alfabesinin geri kalanıyla, noktalama işaretiyle .
ve sayıları belirten bir işaretle doldurdum#
. Aslında, dama tahtası süslü bir ikame şifresidir. Örneğin, "E" ile değiştirilecek 1
ve "W" ile değiştirilecektir 27
.
Düz metin mesajımızı bu dama tahtası ile kodladıktan sonra, ancak önce, rastgele bir konuma bölerek ve büyük harf yaparak mesajımızın başlangıcını daha az belirgin hale getirmeliyiz. Diğer orijinal başlangıcı belirtmek için iki tam durak kullanıyoruz..
We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
olur
HING ELSE. MOVE TO SAFEHOUSE FOXTROT#3#.. WE ARE
DISCOVERED. TAKE WHAT YOU CAN. BURN EVERYT
Dama tahtası ile kodlar, bize veririz:
407020 1293124 496481 96 354114062831 416479869443442424 271 581
2173436481812124 95451 274059 22628 435024 232880 14818229
Mesajın uzunluğu 5 ile bölünemezse, mesajı kapatmak için bazı boş karakterler ekleriz. Mesajımız 109 basamak uzunluğunda, bir tane boş ekleyeceğim: "4".
40702 01293 12449 64819 63541 14062 83141 64798 69443 44242 42715
81217 34364 81812 12495 45127 40592 26284 35024 23288 01481 82294
Not: Örnek mesajımda rakamlar bulunmadığından, burada olduğu gibi #3#
kodlanmış olarak atayabileceğinizi söyleyeceğim 44344
.
3. İlk Aktarma
Transpozisyon tablosunu K1
(Ara Tuşlar bölümünden) ve ardından önceki adımdan kodlanmış mesajı, aynı uzunlukta satırlar halinde, tuşun altına yazarak oluşturun :
K1 6 10 11 0 1 5 7 9 4 8 2 3
4 0 7 0 2 0 1 2 9 3 1 2
4 4 9 6 4 8 1 9 6 3 5 4
1 1 4 0 6 2 8 3 1 4 1 6
4 7 9 8 6 9 4 4 3 4 4 2
4 2 4 2 7 1 5 8 1 2 1 7
3 4 3 6 4 8 1 8 1 2 1 2
4 9 5 4 5 1 2 7 4 0 5 9
2 2 6 2 8 4 3 5 0 2 4 2
3 2 8 8 0 1 4 8 1 8 2 2
9 4
Numaralandırılmış sütunları sayılarına göre alarak şunları elde ederiz:
060826428 246674580 151411542 246272922 961311401 082918141
4414434239 118451234 334422028 293488758 0417249224 794943568
4. İkinci Aktarma
İlk aktarma nispeten basitti. Ancak bu aksak bir aktarımdır. Bozulma modeli, tablonun genişliği ve anahtar tarafından belirlenir. Örneğimizde, 110 basamaklı ve 13 sütunumuz var, yani 8 tam satır ve 6 kalanımız olacak. İlk satırı doldurmaya başlıyoruz, ancak 0 sütununda duruyoruz ve aşağıdaki gibi devam ediyoruz:
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 stop at 0
2 4 6 6 7 4 5 8 0 1 continue in a triangle pattern
5 1 4 1 1 5 4 2 2 4 6
2 7 2 9 2 2 9 6 1 3 1 1
4 0 1 0 8 2 9 1 8 1 4 1 4 until the end
4 1 4 4 3 4 2 3 9 1 1 restart and stop at 1
8 4 5 1 2 3 4 3 3 4 4 2
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 restart and stop at 2
Sonra son birkaç boşluğu kalan rakamlarla dolduruyoruz.
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 7 2 4 9
2 4 6 6 7 4 5 8 0 1 2 2 4
5 1 4 1 1 5 4 2 2 4 6 7 9
2 7 2 9 2 2 9 6 1 3 1 1 4
4 0 1 0 8 2 9 1 8 1 4 1 4
4 1 4 4 3 4 2 3 9 1 1 9 4
8 4 5 1 2 3 4 3 3 4 4 2 3
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 5 6 8
Şimdi, sütunları tam olarak ilk transpozisyonda yaptığımız gibi okuyoruz.
71431148 42711925 861904185 22614147 45499243 28261334 80218938
641701404 025244820 645224398 271283226 94944438 064214521
Ve her şeyi 5 haneli gruplara ayırın:
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189
38641 70140 40252 44820 64522 43982 71283 22694 94443 80642 14521
5. Mesajı Tamamlayın
Son adım, rastgele mesaj tanımlayıcıyı 47921
mesajın kendisine eklemektir. Anahtar tarihin son basamağı 6
grubun sondan başlaması gereken mesafeyi gösterir.
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189 38641
70140 40252 44820 64522 43982 47921 71283 22694 94443 80642 14521
Bu meydan okuma için notlar
- Size en az beş giriş verilir: mesaj, harf anahtar sözcüğü, anahtar sözcük, tarih ve kişisel numara. İki ek giriş ekleyebilirsiniz: rasgele ileti tanımlayıcısı ve iletiyi kapatmak için gereken boş değerler veya işleviniz kendi başına bazı rasgele sayılar üretebilir.
- Tüm girişlerin, doğru sayıda rakam ve harfle geçerli olduğunu varsayabilirsiniz (5 basamaklı mesaj tanımlayıcısı, anahtar kelime grubu için en az 20 rakam, vb.). Dizelerinizde (mesaj ve anahtar kelimeler) sürümünüzde izin verenler dışında tüm noktalama işaretlerinin ve boşlukların zaten kaldırılmış olduğunu ve sayıların zaten sayı işaretleriyle sınırlandığını varsayabilirsiniz.
- İlk anahtar kelimenin içinde yinelenen harfler olmamalıdır ve kodunuzda hiçbir zaman yinelenen harf olmadığını varsayabilirsiniz.
- Kodlamak için kullandığınız dil, dil önceden mevcut olduğu sürece, alfabe önceden mevcut olduğu ve yanıtınızda hangi dili kullandığınızı belirlediğiniz sürece önemli değildir.
- Çizgisel dama tahtanız için hangi alfabeyi kullanırsanız kullanın, dama tahtasını kapatmak için semboller ekleyebilir veya kaldırabilirsiniz. Bu sembolleri ne için kullandığınızı belirtin (örneğin noktalama işaretleri, ayrı bir "mesaj başlangıcı" sembolü, yaygın sözcüklerin sembolleri). Sayı işaretinden tamamen vazgeçebilir ve sayı işaretini başka bir şey için olduğu yuvayı kullanarak sayıları heceleyebilir veya her rakamı dama tahtasına dahil edebilirsiniz. Lütfen cevabınızda hangi dama tahtasını kullandığınızı belirtin.
- Çıktı, boşlukla ayrılmış beş haneli gruplardan oluşan bir dize, beş basamaklı tamsayıların bir listesi veya benzer bir şey olmalıdır.
- Sıfır indeksleme kullandım ve örneğimde
0123456789
. Ne kullandığınızı1234567890
belirttiğiniz sürece cevabınızda 1-endeksleme ve ya da başka bir sistem kullanabilirsiniz.
İşte Ideone üzerinde örnek bir uygulama .
Bu uzun bir yazı ve çoğunu elle yazdım, bu yüzden bu yazıda kafa karıştırıcı parçalar veya sayım ve aktarımda hatalar varsa, lütfen bana bildirin. İyi şanslar ve iyi golf!
without borrowing
ve without carrying
? Size ortalama ekleme ve çıkarma mod yapın 10
, yani (6+7) mod 10 = 3
ve (6-8) mod 10 = 8
?
adding the first two digits without adding
Taşımak mı demek istiyorsun?