37

From : Encryption Co.
To : x$*sj4 (あなたです)

あなたの使命は、それを受け入れることを選択した場合、最短のキーストローク数でプログラムを作成することです。

  • 2 つのファイル名パラメーター (コマンド ラインまたは標準入力) を受け取ります。最初のパラメーターはキーを含むファイルで、2 番目のパラメーターはメッセージです。どちらのファイルもプレーン テキストになります。

  • XOR 暗号化を使用してメッセージにキーを適用し、ファイルを上書きします。

例:

入力ファイル:

StackOverflow はクールです

鍵:

コードゴルフ

暗号化された出力ファイルの 16 進ダンプ:

0000000: 101b 0506 4b08 1909 1425 030b 1200 2e1c  ....K....%......
0000010: 4c25 2c00 080d 0a                        L%,....

簡単にするために、ファイルがメモリに収まると仮定します


このメッセージは 5... 4... 3... 2... 1... で自己暗号化されます。

     #####
    #### _\_  ________
    ##=-[.].]| \      \
    #(    _\ |  |------|
     #   __| |  ||||||||
      \  _/  |  ||||||||
   .--'--'-. |  | ____ |
  / __      `|__|[o__o]|
_(____nm_______ /____\____ 

XOR 暗号化は、キーのサイズがメッセージのサイズ以上であり、キーが公平なランダム プロセスによって生成されている場合、クラックすることは不可能です。参照:ワンタイム パッド。したがって、ここには「不十分な暗号化」はありません。

4

23 に答える 23

25

悔い改め、13 7文字(ファイルサポートなし)、14文字(ファイルサポートあり)

Repentは、J、APL、Golfscript、Pythonからインスピレーションを得た、私自身の難解なスタックベースのおもちゃ言語です。これが簡単な解決策です。説明しますが、非常に遅く、頭を抱えているので、説明して、午前中にSil​​verlightインタープリターをリリースします。

↓↷¦*⊕;€

説明:

↓     Copies the message string back onto the stack
↷    Puts the extra message string to the bottom of stack
¦     Find length of message string
*     Multiply key array by last number - repeats key for at least as long as message
⊕;    Apply XOR between each element corresponding of message array and repeated 
      key array, pushing XOR encoded message to stack
€     Print encoded message string/(char array) as string.

次のように使用します:

Repent "↓↷¦*⊕;€" "Code Golf" "StackOverflow is Cool" > output.txt

出力(ほとんどの文字は表示されません):

Ascii: K    % .L%, 
Hex:   10 1B 05 06 4B 08 19 09 14 25 03 0B 12 00 2E 1C 4C 25 2C 00 08 0D 0A

ファイルを使用すると、次のようになります。

↓↶▲⇄▲↓3↔⇄¦*⊕;▼

言語リファレンス(未完成)

通訳(未完成)

于 2010-08-14T00:15:26.957 に答える
22

Perl、40文字

少し壊れやすいです。

print$/=!1,($_=<>)^substr<>x 1E4,0,y///c

Perlには組み込みの文字列xor演算子があります。この問題を解決するための難しい部分は、2つの弦を同じ長さにすることです。

$/=!1

「レコード区切り文字」を未定義の値に設定し、何も印刷されないようにします。この設定では、ファイル読み取りライン演算子はファイル全体を丸呑みします。

$_=<>

最初のファイル全体(メッセージを含む)を変数にロードします$_

substr <> x 1E4, 0, y///c

2番目のファイル(キー)から別の文字列を作成し、それを10,000回追加します。うまくいけば、(1)この本当に長い文字列はメッセージ文字列よりも長くなり、(2)プログラムがメモリ不足になるほど長くはなりません(このようにこのソリューションは壊れやすいです)。y///cは、の文字​​数をカウントする操作であり$_、と言うよりも1文字短くなりますlength。これにより、キー文字列がメッセージ文字列と同じサイズに短縮されます。

于 2010-08-13T19:10:04.087 に答える
12

C# 190 文字

using System.IO;class a{static void Main(string[] b){var c=File.ReadAllBytes(b[0]);var d=File.ReadAllBytes(b[1]);for(int e=0;e<c.Length;e++) c[e]^=d[e%d.Length];File.WriteAllBytes(b[0],c);}}
于 2010-08-13T17:37:17.227 に答える
8

Python、162 文字

m,r,o=map,raw_input,open
a,b=r(),r()
t,k=m(lambda x:list(o(x).read()[:-1]),[a,b])
o(a,'w').write(''.join(m(chr,m(lambda c:ord(c[0])^ord(c[1]),zip(t,len(t)*k)))))

Python 3、143 文字

i,o=input,open
a,b=i(),i()
t,k=map(lambda x:list(o(x,'rb').read()[:-1]),[a,b])
o(a,'wb').write(bytes(map(lambda c:c[0]^c[1],zip(t,len(t)*k))))
于 2010-08-13T18:52:15.690 に答える
8

GolfScript、28 文字

n.+/~:k;.,.)k.,@\/)*<{\(@^}%

使用するには、メッセージ ファイル、改行、キー ファイルをスクリプトの標準入力に渡します。

$ (cat message-file ; echo ; cat key-file) | ruby golfscript.rb poorencrypt.gs

$ (エコー StackOverflow はクールです;エコー;エコー コード ゴルフ) | \
          ruby golfscript.rb poorencrypt.gs > エンコードされたファイル
$ (猫エンコード ファイル;エコー;エコー コード ゴルフ) | ruby golfscript.rb poorencrypt.gs
StackOverflow はクールです
于 2010-08-13T20:42:34.037 に答える
7

Java、319 313 310 文字


  • 更新 1:に置き換えchar[]c=r(a[0]);char[]k=r(a[1]);られchar[]c=r(a[0]),k=r(a[1]);、6 文字節約されました。

  • 更新 2:に置き換えfor(int i=0;i<c.length;c[i]^=k[i++%k.length]);られint i=0;for(char p:c)c[i]^=k[i++%k.length];、3 文字節約されました。


import java.io.*;class X{public static void main(String[]a)throws Exception{char[]c=r(a[0]),k=r(a[1]);int i=0;for(char p:c)c[i]^=k[i++%k.length];Writer w=new FileWriter(a[0]);w.write(c);w.close();}static char[]r(String a)throws Exception{return new BufferedReader(new FileReader(a)).readLine().toCharArray();}}

より読みやすいバージョン:

import java.io.*;
class X{
 public static void main(String[]a)throws Exception{
  char[]c=r(a[0]),k=r(a[1]);int i=0;for(char p:c)c[i]^=k[i++%k.length];
  Writer w=new FileWriter(a[0]);w.write(c);w.close();
 }
 static char[]r(String a)throws Exception{
  return new BufferedReader(new FileReader(a)).readLine().toCharArray();
 }
}

Java IO は非常に冗長です。2 つの file-to-char[] 読み取りをメソッドにリファクタリングすると、4 文字節約されました。はい、ライターを閉じる (フラッシュする) ことは絶対に必要です。それ以外の場合、ファイルは空のままです。そうでなければ、298 292 289 文字でした。

于 2010-08-14T04:25:51.860 に答える
6

Python3 - 114 文字

stdin からパラメーターを受け取ります

a=input().split()
k,t=[open(x,"rb").read()for x in a]
open(a[1],"wb").write(bytes(x^y for x,y in zip(k*len(t),t)))
于 2010-08-14T07:37:06.217 に答える
4

Perl ソリューション、59 (42) 文字

(これまでのところ機能しているように見えるワンライナーに準拠しています:)

計算されたキーの長さを持つプログラム (59 文字):

 $.-1?$_^=substr($k x((length)/length($k)+1),0,length):$k=$_

Mobrule の「壊れやすい」アプローチをキーの長さに使用する場合、42 文字になります。

 $.-1?$_^=substr($k x 1e4,0,(length)):$k=$_

コマンドライン:

 $> perl -i -0777 -pe'<insert above>' keyfile messagefile

これにより、メッセージが xor-ed 形式書き換えられ、クリア テキスト形式に戻ります。

 $> cat keyfile ; cat messagefile

 Code Golf
 StackOverflow is Cool

適用コマンド:

 $> perl -i.bak -0777 -pe'<insert above>' keyfile messagefile
 $> cat keyfile ; cat messagefile

 Code Golf
 ^P^[^E^FK^H^Y   ^Tl/^@^SEI4O/   e/e

再度適用:

 $> perl -i.bak -0777 -pe'<insert above>' keyfile messagefile
 $> cat keyfile ; cat messagefile

 Code Golf
 StackOverflow is Cool

よろしく

rbo

于 2010-08-14T15:43:25.273 に答える
4

F#、168 文字

open System.IO
[<EntryPoint>]
let main a=
let k=File.ReadAllBytes a.[1]
let z i v=v^^^k.[i%k.Length]
File.WriteAllBytes(a.[0], Array.mapi z (File.ReadAllBytes a.[0]))
0

注: ほとんどが IO で、キーは Array.mapi です。また、一部の F# Guru は、おそらくこのソリューションを完全に打ち負かすでしょう。私は生粋の C# プログラマーであり、F# を楽しみ以外の目的で使用したことはありません。

于 2010-08-13T17:19:52.300 に答える
4

Ruby 72 62 文字

$<.inject{|k,l|l.each_byte{|b|$><<(b^(r=k.slice!0)).chr;k<<r}}

\n入力キーからa を取り除く必要がなければ、10 文字を節約できk=a.chomp; ました。

制限: 単一行のキーのみを処理します。

使い方:

$<すべての入力ファイルのすべての行を含む配列のように機能します。

.inject配列を反復処理し、

{|k,l| : 最初のパスでは、引数はキー行であり、入力の最初の行です。

l.each_byte{|b|入力行から各文字を int として取得します。

$><<「印刷」を意味します

(b^(r.k.slice!0)キーの最初の文字で 'b' を XOR します (これをスライスして 'r' に格納します)。

.chr;整数を ascii に変換します

k<<rキーの最初の文字を最後までローテートします。

}}ブロックは更新された k を生成します。これは、次に注入するパスの最初の引数として使用されます。2 番目の引数は、入力の次の行になります。

于 2010-08-13T23:48:52.603 に答える
3

Haskell、181 文字

Haskell でゴルフをしている場合、I/O は厄介であり、バイナリ I/O は 2 倍です。このソリューションは、おそらく大幅に改善される可能性があります。お気軽に!

import Data.Bits
import Data.ByteString as B
u=unpack
g o[l,n]=o$pack$Prelude.zipWith xor(u n)(cycle$u l)
f x=mapM B.readFile x>>=g(B.writeFile$x!!1)
main=Prelude.getLine>>=f.words

使用法:

$ ghc --make encrypt.hs
$ echo -n 'Code Golf' > key
$ echo -n 'StackOverflow is Cool' > message
$ echo 'key message' | ./encrypt
$ od -tx1 message
于 2010-08-13T21:24:36.717 に答える
3

q、88文字

Arthur Whitney によって書かれ、APL と Lisp に触発された言語であるhttp://kx.com/のq を使用して実装されています。

a[0]1:"x"$2 sv'{(x|y)&not x&y}.'0b vs''flip{y:count[x]#y;(x;y)}.(read1')a:(hsym')`$'.z.x

何が起こっているのかを少し説明します: (右から左に読んでください)

a:(hsym')`$'.z.x

ランタイム引数のリストから 2 つのファイル ハンドルのリストを作成し、変数「a」で後で使用するために保存します。

(read1')

2 つのファイルをループして読み取り、byte=0x00..0xFF ((22 バイト),(10 バイト)) であるバイトのリストのリストを返します。

{y:count[x]#y;(x;y)}.

メッセージと同じ長さにキーを成形します。キーが長すぎる場合は切り捨てられ、短すぎる場合は繰り返されます。リストは適切にフォーマットされ、2x22 になりました。

flip

リストを転置すると、22x2 になります。

0b vs''

リストのすべての要素をバイナリ型に変換します

{(x|y)&not x&y}.'

22 要素すべての XOR ペアは、8 つのブール値のリストのリストを返します

"x"$2 sv'

ブール値の 8 ビットをバイトに変換します。

a[0]1:

ファイルを書き込み、元のメッセージ ファイルをオーバーライドします。

サンプルラン:

$ cp message.txt message.txt.bk
$ q g.q message.txt key.txt    
$ diff -s message.txt message.txt.bk0
Binary files message.txt and message.txt.bk0 differ
$ q g.q message.txt key.txt          
$ diff -s message.txt message.txt.bk0
Files message.txt and message.txt.bk0 are identical
于 2010-08-14T17:01:55.693 に答える
3

PowerShell、125 115 文字

これまでのところ、これは最短の.netベースの回答のようです:

$k=[char[]](gc $args[1]);$i=0;sc $args[0] ([byte[]]([char[]](gc $args[0])|%{$_ -bXor $k[$i++%$k.Length]})) -en byte

コマンドの略語が綴られたきれいなバージョン:

$k=[char[]](get-content $args[1])
$i=0
set-content `
   $args[0] `
   ([byte[]] ([char[]] (get-content $args[0]) `
              | foreach {$_ -bXor $k[$i++ % $k.Length]})) `
   -encoding byte

使用法: powershell codegolf.ps1 message.txt key.txt. 要求通り、上書きしますmessage.txt

于 2010-08-14T13:17:50.550 に答える
2

Python - 127 文字

キーファイルとデータファイルにコマンドラインパラメータを使用

import sys
a=sys.argv
_,k,t=[open(x).read()for x in a]
s=open(a[2],"w").write
[s(chr(ord(x)^ord(y)))for x,y in zip(k*len(t),t)]

stdout への書き込み - 109 文字

import sys
_,k,t=[open(x).read()for x in sys.argv]
print"".join(chr(ord(x)^ord(y))for x,y in zip(k*len(t),t))
于 2010-08-14T07:08:01.760 に答える
2

Ruby - 158 chars

def a(b);File.readlines(b).join("\n").chomp;end;t=a($*[0]);k=a($*[1]);File.open($*[0],"w"){|f|0.upto(t.length-1){|i|f.putc((t[i]^k[i.modulo(k.length)]).chr)}}

Prettier version:

def a(b)
    File.readlines(b).join("\n").chomp
end

t = a($*[0])
k = a($*[1])

File.open($*[0],"w") {|f|
    0.upto(t.length - 1) {|i|
        f.putc((t[i] ^ k[i.modulo(k.length)]).chr)
    }
}

This solution takes advantage of the following aspect of the problem:

Your mission, should you choose to accept it, is to create a program in the shortest number of keystrokes that...

This solution was written on my tablet using handwriting recognition for input. No keys were stroked in the creation of this code. Therefore, this program was developed in zero keystrokes. Game over, I win!

于 2010-08-13T22:47:22.460 に答える
1

Java 、336 316 405 文字

編集:ファイルから読み取る必要があることを忘れていました。*はぁ

public class A {
public static void main(String[] a) throws Throwable {
    char[] p = new BufferedReader(new FileReader(a[1])).readLine().toCharArray();
    char[] t = new BufferedReader(new FileReader(a[0])).readLine().toCharArray();
    int u = t.length;
    int k = 0;
    for (int i = 0; i < u; i++) {
        new FileOutputStream (a[0]).write((char) ((int) t[i] ^ (int) p[k]));
        k = k = ++k % p.length;
    }
}
}

試してみる価値がありました。しかし、Java がここで最高の言語だとは思いません...

于 2010-08-14T03:20:30.697 に答える
0

PHP、142、141文字

編集1: fputs()の代わりにfwrite()

$t=fopen($argv[1],'r+');$s=fgets($t);rewind($t);$k=fgets(fopen($argv[2],'r'));for($i=0;$i<strlen($s);$i++)fputs($t,$s{$i}^$k{$i%strlen($k)});

きれいなプリント:

$t = fopen($argv[1],'r+');
$s = fgets($t);
rewind($t);
$k = fgets(fopen($argv[2],'r'));
for($i=0; $i<strlen($s); $i++)
  fputs($t, $s{$i} ^ $k{$i % strlen($k)});
于 2010-08-14T01:29:12.727 に答える
0

C#、168:

using System.IO;class a{static void Main(string[] b){File.WriteAllBytes(b[0],File.ReadAllBytes(b[0]).Select((x,i)=>x^File.ReadAllBytes(b[1])[i%d.Length]).ToArray());}}

機能的なソリューション。読み取り操作をインライン化して変数を保存しました。これにより、読み取り操作が繰り返し実行されます。

于 2012-04-11T23:28:16.867 に答える
0

F#、147146文字

これは、 driis のソリューションに大きく基づいています。私が行ったのは、必要なインデントを追加してコンパイルし、コマンド ライン パラメーターの順序を切り替えて、物事を引き締めただけです。それでも少し短縮できても不思議ではありません。注: 不完全なパターン マッチに関する警告が表示されます。通常、私はこれについて最初に不満を言うでしょうが、コード ゴルフは通常のベスト プラクティスの例外に値すると思います。:)

open System.IO[<EntryPoint>]let m[|a;b|]=File.ReadAllBytes|>fun r->r a|>fun k->File.WriteAllBytes(b,Array.mapi(fun i->(^^^)k.[i%k.Length])(r b));0

F#、147 文字、より読みやすい

open System.IO
let r=File.ReadAllBytes
[<EntryPoint>]
let m[|a;b|]=
 let k=r a
 File.WriteAllBytes(b,Array.mapi(fun i->(^^^)k.[i%k.Length])(r b));0
于 2010-08-14T00:19:13.263 に答える
0

KSH93 - 152 文字

m=$(<$1)
k=$(<$2)
for ((e=0;e<${#m};e++)) 
do
out="$out$(printf "%02X" $(("'${m:$e:1}"^"'${k:${e}%${#k}:1}")))"
done
echo "${out}0d0a" | xxd -p -r >$1
于 2010-08-14T18:04:30.123 に答える
0

Java - 306 文字

BalusC の Java ソリューションをベースとして使用:

import java.io.*;class X{public static void main(String[]a)throws Exception{final char[]c=r(a[0]),k=r(a[1]);int i=0;for(int p:c)c[i]^=k[i++%k.length];new FileWriter(a[0]){{write(c);}}.close();}static char[]r(String a)throws Exception{return new BufferedReader(new FileReader(a)).readLine().toCharArray();}}

より読みやすい:

import java.io.*;
class X{
 public static void main(String[]a)throws Exception{
  final char[]c=r(a[0]),k=r(a[1]);int i=0;for(int p:c)c[i]^=k[i++%k.length];
  new FileWriter(a[0]){{write(c);}}.close();
 }
 static char[]r(String a)throws Exception{
  return new BufferedReader(new FileReader(a)).readLine().toCharArray();
 }
}

実際にコードをテストしたわけではありませんが、大幅な変更も行っていません。

于 2010-08-20T17:40:56.370 に答える
0

C - 163 161 文字

フラッシュを追加し、不要なシークを削除しました。

ゴルフした:

#include <stdio.h>
int*p,l;char*k;main(int c,char**v){FILE*f=fopen(*++v,"rb+");k=p=*++v;while(fgets(&l,2,f)){fseek(f,-1,1);putc(l^*k++,f);fflush(f);if(!*k)k=p;}}

非ゴルフ:

#include <stdio.h>
int*p,l;
char*k;
main(int c,char**v){
    FILE*f=fopen(*++v,"rb+");
    k=p=*++v;
    while(fgets(&l,2,f)){
        fseek(f,-1,1);
        putc(l^*k++,f);
        fflush(f);
        if(!*k)k=p;
    }
}
于 2010-12-08T03:01:51.590 に答える
0

Python、154 文字

import sys,struct;_,f,k=sys.argv
open(f,'r+b').write(''.join(struct.pack('B',ord(a)^ord(b))for a,b in zip(open(f,'r+b').read(),open(k,'rb').read()*1000)))
于 2010-08-13T19:06:14.207 に答える