> restart: # Umrechnen zwischen Bytefolgen und Zahlen > bytes2number := proc( X ) > local x,i; > x:=0: > for i to nops(X) do > x:=256*x+X[nops(X)+1-i]; > od; > x; > end: > number2bytes := proc( xx, l ) > local X,x; > x:=xx; > X:=NULL; > to l do > x:=iquo( x, 256, 'r' ); > X:=(X,r); > od; > if x<>0 then print("Warnung: Informationsverlust! ",x); fi; > [eval(X)]; > end: > # RSA > N := 11490436826830494149622108307652660044152126245241753721566611: > phiN := > 11490436826830494149622108307642448732977418697626067520174392: > e := 3004510644968813048233058717811100614819243903353950594001587: > n:=floor(log[256](N))+1; # Verschlüsselungsfunktion. # (Achtung! Bloß NICHT x^e mod N verwenden ... # Modular geht viel schneller;-) > encrypt := proc( N, e, x ) > x &^ e mod N; > end:# # In welchem Ordner liegen die Dateien? # [Der Ordnername MYFOLDER/ ist entsprechend anzupassen ...] > FOLDER:="MYFOLDER/": # Öffne die Klartextdatei zum Lesen. Diese Daten sollen verschlüsselt # werden. > INPUT :=fopen( "".FOLDER."bild.gif", READ, BINARY ): # Öffne die Geheimtextdatei zum Schreiben. Hier sollen die # verschlüsselten Daten hin. > OUTPUT:=fopen( "".FOLDER."bild.crypt", WRITE, BINARY ): # Stopuhr starten zum Zeit messen. > st:=time(): # Schleifenanfang. > do # Lies n-1 bytes. (Mehr darf nicht sein, da x höchstens N sein darf. > X:=readbytes( INPUT, n-1 ); # Wenn nichts mehr gelesen wurde, ist die Datei `am Ende': Schleife # verlassen. > if X=0 then break; fi; # Gelesene Bytes in eine Zahl umwandeln. # (Also x:=sum( X[k-i] * 256^i, i=0..k-1 ), wobei k die Anzahl der Bytes # in X ist.) > x:=bytes2number( X ); # Verschlüsseln. > y:=encrypt( N, e, x ); # Verschlüsselte Zahl in eine Folge von n Bytes umwandeln. # (Gegenstück zu oben. ACHTUNG! Die Zahl N selbst braucht n Bytes, # daher ist ein Block hier um ein Byte länger als beim Lesen!) > Y:=number2bytes( y, n ); # Verschlüsselte Bytes schreiben. > writebytes( OUTPUT, Y ); # Sicherstellen, daß sofort alles auf der Platte landet. > fflush(OUTPUT); # Schleifenende. > od: # Zeit ausgeben. > time()-st; # Dateien schließen. > fclose(INPUT); > fclose(OUTPUT); >