Encryption 代码:XOR加密

Encryption 代码:XOR加密,encryption,code-golf,xor,Encryption,Code Golf,Xor,来自:加密公司 到:x$*sj4(就是你) 如果您选择接受它,您的任务是以最短的击键次数创建一个程序 接受两个文件名参数(命令行或stdin),第一个是包含密钥的文件,第二个是包含消息的文件。两个文件都是纯文本 使用将密钥应用于消息,覆盖文件 示例: #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)){fse

来自:加密公司
:x$*sj4(就是你)

如果您选择接受它,您的任务是以最短的击键次数创建一个程序

  • 接受两个文件名参数(命令行或stdin),第一个是包含密钥的文件,第二个是包含消息的文件。两个文件都是纯文本

  • 使用将密钥应用于消息,覆盖文件

示例:

#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;
    }
}
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());}}
输入文件:

这很酷

关键:

代码高尔夫

加密输出文件的十六进制转储:

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加密就不可能破解。请参阅:。所以这里没有“糟糕的加密”。

F#,168个字符
opensystem.IO
[]
让主a=
设k=File.ReadAllBytes a[1]
设z i v=v^^^^k.[i%k.Length]
File.writealBytes(a[0],Array.mapi z(File.ReadAllBytes a[0]))
0
注意:主要是IO,键是Array.mapi。此外,一些F#Guru可能会把这个解决方案打得一败涂地——我是一名C#程序员,除了为了好玩而学习,我从来没有用F#做过任何事情。

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

使用System.IO;a类{static void Main(string[]b){var c=File.ReadAllBytes(b[0]);var d=File.ReadAllBytes(b[1]);for(int e=0;ePython,162个字符

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);}}
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)))))
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))))
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)))
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))
Python 3143个字符

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

Python,154个字符

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);}}
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)))))
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))))
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)))
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))
Perl,40个字符 它有点易碎

print$/=!1,($_=<>)^substr<>x 1E4,0,y///c
将“记录分隔符”设置为未定义的值,并且不会导致打印任何内容。使用此设置,file readline运算符将在整个文件中发出声音

$_=<>
从第二个文件(密钥)中创建另一个字符串,并将其添加到自身中10000次。希望,(1)这个非常长的字符串将比消息字符串长,(2)不会太长,导致程序内存不足(这就是此解决方案的脆弱性).
y///c
是一种计算
$\u
中字符数的操作,比说
length
短一个字符。这会将键字符串缩短到与消息字符串相同的大小。

GolfScript,28个字符
$(echo StackOverflow很酷;echo;echo Code Golf)|\ ruby golfscript.rb poorencrypt.gs>编码文件 $(cat编码文件;echo;echo代码Golf)| ruby golfscript.rb poorencrypt.gs 这很酷 哈斯克尔,181查尔 在Haskell打高尔夫球时,I/O是个婊子,二进制I/O更是如此。这个解决方案可能会有很大的改进。请随意

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
Ruby-158个字符 更漂亮的版本:

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)
    }
}
此解决方案利用了问题的以下方面:

你的使命,你应该选择 接受它,就是在中创建一个程序 最短的击键次数 那

此解决方案是使用手写识别输入在我的平板电脑上编写的。创建此代码时没有按键。因此,此程序是在零按键的情况下开发的。游戏结束,我赢了!

Ruby72 62个字符

$<.inject{|k,l|l.each_byte{|b|$><<(b^(r=k.slice!0)).chr;k<<r}}
$REPLACT,13个7字符(无文件支持),14个字符(有文件支持)
忏悔是我自己的一种基于堆栈的深奥玩具语言,灵感来自于J、APL、Golfscript和Python。这里有一个简短的解决方案。我将对此进行解释,但已经很晚了,这是我的头绪,所以我将在上午解释并发布Silverlight解释器

↓↷¦*⊕;€
说明:

↓     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
输出(大多数字符不显示):


使用文件是:

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

F#,147 146个字符 这在很大程度上是基于。我所做的只是添加了必要的缩进,因此它进行了编译,切换了命令行参数的顺序,并收紧了一些内容。但是,如果它仍然可以被缩短一点,我也不会感到惊讶。注意:您会收到关于模式匹配不完整的警告。通常我会第一个抱怨它他的,但我认为代码高尔夫值得一个例外,通常的最佳做法

open System.IO[]让m[|a;b |]=File.ReadAllBytes |>fun r->r a |>fun k->File.writealbytes(b,Array.mapi(fun i->(^^^^)k.[i%k.Length])(rb 0
F#,147个字符,可读性更强
opensystem.IO
设r=File.ReadAllBytes
[]
设m[|a;b]=
设k=ra
File.writealBytes(b,Array.mapi(fun i->(^^^^)k.[i%k.Length])(rb));0
PHP,142 141个字符 编辑1:
fputs()
而不是
fwrite()

$t=fopen($argv[1],'r+');$s=fgets($t);倒带($t);$k=fgets(fopen($argv[2],'r'));for($i=0;$iJava,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;
    }
}
}
公共A类{
publicstaticvoidmain(字符串[]a)抛出Throwable{
char[]p=new-BufferedReader(new-FileReader(a[1])).readLine().tocharray();
char[]t=new BufferedReader(新文件读取器(a[0])).readLine().tocharray();
int u=t.长度;
int k=0;
对于(int i=0;i
这是值得一试的。但是我不认为Java是这里最好的语言…

Java,3193130字符
  • 更新1:替换了
    char[]c=r(a[0]);char[]k=r(a[1]);
    by
    char[]c=r(a[0]),k=r(a[1]);
    ,保存了6个字符

  • 更新2:替换了(int i=0;iPython-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)]
    
    写入标准输出-109字符

    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);}}
    
    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)))))
    
    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))))
    
    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)))
    
    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))
    
    蟒蛇3-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)))
    
    PowerShell,125 115 chars 到目前为止,这似乎是基于.net的最短答案:

    $k=[char[]](gc $args[1]);$i=0;sc $args[0] ([byte[]]([char[]](gc $args[0])|%{$_ -bXor $k[$i++%$k.Length]})) -en byte
    
    p
    (read1')
    
    {y:count[x]#y;(x;y)}.
    
    flip
    
    0b vs''
    
    {(x|y)&not x&y}.'
    
    "x"$2 sv'
    
    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
    
    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
    
    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();
     }
    }
    
    #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;
        }
    }
    
    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());}}