GolfScript, 60 karakter
{[[0 1{.283{1$2*.255>@*^}:r~^}255*].@?~)={257r}4*99]{^}*}:S;
Bu kod, S
bayt alan ve Rijndael S-box'ı uygulayan adlı bir işlevi tanımlar . (Ayrıca r
birkaç karakter kaydetmek için adlandırılmış bir dahili yardımcı işlevi kullanır .)
Bu uygulama, Thomas Pornin tarafından önerildiği gibi GF (2 8 ) tersini hesaplamak için bir logaritma tablosu kullanır . Birkaç karakter kaydetmek için, tüm logaritma tablosu her girdi baytı için yeniden hesaplanır; buna rağmen ve GolfScript genel olarak çok yavaş bir dil olmasına rağmen, bu kod eski dizüstü bilgisayarımdaki bir baytı işlemek için sadece 10 ms sürüyor. Logaritma tablosunu (as ) önceden hesaplamak, bayt başına yaklaşık 0,5 ms'ye kadar hızlar ve üç karakter daha mütevazı bir maliyetle:L
[0 1{.283{1$2*.255>@*^}:r~^}255*]:L;{[L?~)L={257r}4*99]{^}*}:S;
Kolaylık için, S
yukarıda tanımlandığı gibi, S kutusunun tamamını Wikipedia'da olduğu gibi onaltılık olarak hesaplamak ve yazdırmak için çağıran basit bir test takımı :
"0123456789abcdef"1/:h; 256, {S .16/h= \16%h= " "++ }% 16/ n*
Bu kodu çevrimiçi deneyin.
(Çevrimiçi demo, çok fazla zaman almamak için logaritma tablosunu önceden hesaplar. Buna rağmen, çevrimiçi GolfScript sitesi bazen rastgele zaman aşımına uğrayabilir; bu, siteyle ilgili bilinen bir sorundur ve yeniden yükleme genellikle bunu düzeltir.)
Açıklama:
Logaritma tablosu hesaplamasıyla ve özellikle yardımcı işleviyle başlayalım r
:
{1$2*.255>@*^}:r
Bu işlev yığın üzerinde iki giriş alır: bir bayt ve bir azaltma bit maskesi (256 ve 511 arasında bir sabit). Girdi baytını çoğaltır, kopyayı 2 ile çarpar ve sonuç 255'i aşarsa, 256'nın altına geri getirmek için bitmask ile XORs yapar.
Günlük tablosu oluşturma kodu içinde, işlev r
, 283 = 0x11b azaltma bitmaskiyle çağrılır ( Rijndael GF'ye karşılık gelir (2 8 ) azaltma polinomu x 8 + x 4 + x 3 + x + 1'e karşılık gelir) ile çağrılır ve sonuç XORed olur orijinal bayt ile etkin bir şekilde Rijndael sonlu alanında 3 (= x + 1, bir polinom olarak) ile çarparak . Bu çarpma, bayt 1'den başlayarak 255 kez tekrarlanır ve sonuçlar (artı bir başlangıç sıfır baytı), L
şuna benzeyen 257 elemanlı bir diziye toplanır (orta kısım atlanır):
[0 1 3 5 15 17 51 85 255 26 46 ... 180 199 82 246 1]
257 elementin olmasının nedeni, yukarıda belirtilen 0 ve 1'in iki kez meydana gelmesiyle, herhangi bir baytın modüler tersini, sadece bu dizideki (sıfır temelli) dizinine bakarak, reddederek ve bakarak bulabiliriz. aynı dizideki reddedilen dizindeki baytı yukarı kaldırın. (GolfScript'te, diğer birçok programlama dilinde olduğu gibi, negatif dizi dizinleri, dizinin sonundan geriye doğru sayar.) Aslında, L?~)L=
işlevin başındaki kod tam olarak budur S
.
Kodun kalan yardımcı işlevini çağırır r
azalma ile dört kez 257 = 2 bit maskesi 8 ters giriş bayt dört bit döndürülmüş kopya oluşturmak için + 1. Bunların tümü 99 = 0x63 sabiti ile birlikte bir dizi halinde toplanır ve nihai çıktıyı üretmek için birlikte XORed edilir.