encrypt/decrypt string in printable format

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

encrypt/decrypt string in printable format

Post by semika » Thu Feb 01, 2007 4:45 pm

Hello συνάδελφοι!

Έχω μια τεχνική απορία για κάποιον που γνωρίζει java!
Γράφω ένα προγραμματάκι που παίρνει ένα string, το κρυπτογραφεί, το τυπώνει και μετά το αποκρυπτογραφεί ώστε να εμφανιστεί το αρχικό string.

Χρησιμοιπιώ την ιδιότητα του XOR (exclusive OR),δηλ
10001 XOR
11010 =
01011

Το given string αποτελείται από γράμματα - αριθμούς και σημεία στίξης.
Όλα πάνε καλά, αλλά όταν τυπώνω το κρυπτογραφημένο stirng έχω κάποια bytes που δεν είναι printable. Αυτό είναι λογικό αλλά όχι βολικό για το χρήστη.

Έχω βρει μια ρουτίνα σε vb (http://www.codetoad.com/visual_basic_better_xor.asp) που η περιγραφή της μοιάζει με το πρόβλημά μου
Μήπως μπορέι κάποιος να με βοηθήσει να τη μεταγλωττίσω σε java?

Βασικά έχω προσπαθήσει, αλλά μάλλον δεν καταλαβαίνω σωστά:
(1) Το & είναι για string concatenation ή bitwise operation?
(2) Γιατί κάνει αυτόν τον έλεγο:
tempstring = Hex(temp)
If Len(tempstring) = 1 Then tempstring = "0" & tempstring

Γενικά τον αλγόριθμό του δεν καταλαβαίνω και πολύ καλά. Στη "μετάφραση" δεν έχω πρόβλημα.

Any help will be greatly appreciated!

Thanks,
Semi
[/b]
Erevodifwntas
Gbyte level
Gbyte level
Posts: 1098
Joined: Thu Apr 22, 2004 2:18 pm
Academic status: Alumnus/a
Gender:
Location: In a Long Time Ago in A Galaxy far far away
Contact:

Post by Erevodifwntas » Thu Feb 01, 2007 5:20 pm

δεν διάβασα σε βάθος το Link αλλά το
If Len(tempstring) = 1 Then tempstring = "0" & tempstring

σημαίνει ότι αν η δεκαεξαδική αναπαράσταση του temp είναι μόνο ένας χαρακτήρας, τότε να βάζει και ένα 0 πριν την αναπαράσταση. με αυτόν τον τρόπο εξασφαλίζει ότι ανά δύο δεκαεξαδικά ψηφία, έχουμε και την αναπαράσταση ενός temp (δεν ξέρω τι είναι το temp αλλά μάλλον παίρνει τιμές μόνο ανάμεσα στο 0 και το 255)

το & νομίζω συνδέει δύο strings (το αντίστοιχο του + στη java -π.χ. "καλή"+"μέρα").

πολλούς χαιρετισμούς!!! είχα καιρό να σε πετύχω στο forum ;-)
Go To Statement Considered Harmful (Τιτλος δημοσίευσης του Edsger Dijkstra).

my personal site
User avatar
lumenintervalum
Wow! Terabyte level
Wow! Terabyte level
Posts: 2377
Joined: Thu May 06, 2004 7:06 pm
Location: somewhere far beyond..
Contact:

Post by lumenintervalum » Thu Feb 01, 2007 5:31 pm

Το "&" έχω βρει (από το "Teach yourself Java 2 in 21 days") ότι κάνει τα παρακάτω στη Java
&: integral bitwise AND binary infix
&: Boolean logical AND binary infix
, δηλαδή όχι String concantenation (γι αυτή τη δουλειά βάζεις +)

Η AND βγάζει 1 μόνο στις περιπτώσεις που έχεις απο τη μια μεριά 1 και από την άλλη 1, δηλαδή
Left Right AND (&)
1 1 1
1 0 0
0 1 0
0 0 0
για java ρωτάς ή για vb??ομολογώ με μπερδέψατε ολίγον...
We are just a moment in time
A blink of an eye
A dream for the blind
Visions from a dying brain
I hope you don't understand
_______________________
scraps& photo gallery στο deviantart- last update 25/08/06
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Re: encrypt/decrypt string in printable format

Post by HdkiLLeR » Thu Feb 01, 2007 7:22 pm

semika wrote:
Βασικά έχω προσπαθήσει, αλλά μάλλον δεν καταλαβαίνω σωστά:
(1) Το & είναι για string concatenation ή bitwise operation?
(2) Γιατί κάνει αυτόν τον έλεγο:
tempstring = Hex(temp)
If Len(tempstring) = 1 Then tempstring = "0" & tempstring

Γενικά τον αλγόριθμό του δεν καταλαβαίνω και πολύ καλά. Στη "μετάφραση" δεν έχω πρόβλημα.
Σχετικά με το 1) τώρα στην VB:

Ο τελεστής & είναι δυαδικός (έχει αριστερό και δεξί τελεστέο δηλαδή) και χρησιμοποιείται για το concatenation. Έχει ακριβώς την ίδια λογική όπως λέει και ο Γιώργος με το + στην Java.

Για το 2):
To πρόβλημα σου με το XOR encryption method είναι ότι μπορεί το αποτέλεσμα να μην είναι printable χαρακτήρας. Τι σημαίνει αυτό πιο απλά (εάν μιλάμε για ASCII code) ότι ο τακτικός αριθμός του (ordinal number) ανήκει στην περιοχή [0-31]. Απο το [32-127] τα ordinal numbers ανήκουν σε printable chars. Οπότε εάν πχ πάρεις το x και το κάνεις XOR με το 1111111 έχεις:

Code: Select all

x = 120 = 1111000 XOR 1111111 = 0000111
0000111 = 7 = BEL
Άρα ο χαρακτήρας που έχεις είναι το alarm :)

Αρκετά τώρα με τις θεωρίες :), λοιπόν ο τύπος κάνει το εξής απλό:

Code: Select all

1: temp = (intXOrValue1 Xor intXOrValue2)
2: tempstring = Hex(temp)
3: If Len(tempstring) = 1 Then tempstring = "0" & tempstring
1: Στο temp βάζει το XOR των δύο chars (του κλειδιού και των δεδομένων)
2: Στο tempstring δίνει την δεκαεξαδική τιμή του temp σε String (εάν το temp = αποτέλεσμα του xor για παράδειγμα έβγαζε 90 = Z τότε το tempstring θα είχε την τιμή 5Α σε String = 2 χαρακτήρες δηλαδή).
3: Εάν το tempstring έχει μέγεθος ενός χαρακτήρα (δηλαδή έχουμε πέσει σε κάποιον απο τους non-printable chars [0-15]) τότε βάζει tempstring = "0" & tempstring για να δημιουργήσει ζευγαράκι σε hex αναπαράσταση (το Α θα γίνει δηλαδή 0A κλπ). Γιατί το κάνει αυτό; Γιατι πολύ απλά το decode το κάνει ανα ζευγάρι μετά δηλαδή δεν παίρνει ένα ένα τα chars για να κάνει ξανά XOR κλπ αλλά παίρνει ζευγαράκια απο χαρακτήρες για να τους κάνει decode. Κοινώς το αποτέλεσμα του encode πρέπει να βγεί ζυγός αριθμός (γι' αυτό και το loop στο decode δεν γίνεται για len(datain) αλλά για len(datain)/2 αφού σε κάθε επανάληψη παίρνει δύο χαρακτήρες για επεξεργασία.

Γενικά δεν είναι και κάτι τρομερά έξυπνο γιατί τελικά το αποτέλεσμα του encode δεν είναι τα encoded chars αλλά ένα String όπου ανα δύο χαρακτήρες δίνουν την δεκαεξαδική μορφή ενός encoded char. Δηλαδή εάν ήταν να κάνουμε encode 500MB με αυτό XOR method το αποτέλεσμα θα ήταν 1GB encoded :) :)
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Thu Feb 01, 2007 10:13 pm

Ευχαριστώ όλους για τις απαντήσεις σας.
(1) Erevodifwntas η αλήθεια είναι ότι μπάινω συχνά αλλά από το γραφείο έχουν απενεργοποιήσει τα scripts και δε μπορώ να κάνω post (Σήμερα είχα άδεια). Μου έχετε λείψει γενικά όλοι!
(2) HdkiLLeR ναι καταλαβαίνω γιατί το XOR από μόνο του δε δουλεύει σωστά σε αυτό που πάω να κάνω. Αυτό που με βοήθησε ήταν η επεξήγησή σου στην περιγραφή του αλγόριθμου. Το "μετέφρασα".
Από ότι όμως καταλαβαίνω δεν είναι και τόσο καλό, αφού για κάθε χαρακτήρα, βάζει 2 χαρακτήρες. Ευχαριστώ πολύ!
(3) lumenintervalum για vb μιλούσα. Με καλύψαν τα παιδιά!


Εχω λοιπόν μια άλλη απορία στο ίδιο θέμα.
Έστω ότι έχουμε ένα string το οποίο αποτελείται από γράμματα-νούμερα και σημεία στίξης. (Γενικα ότι απεικονίζεται σε ένα πληκτρολόγιο).
Θέλουμε με κάποιο τρόπο να το κρυπτογραφήσουμε αλλά το αποτέλεσμα να είναι printable. Επίσης να υπάρχει δυνατότητα αποκρυπτογράφησης.
Πώς θα το χειριζόσασταν... Ένας υποτυπώδης αλγόριθμος - μια μικρή ιδέα - ένα url είναι αρκετά. Μη χάσετε πολύ χρόνο. Κάτι from the top of your head.

Million Thanks!
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Fri Feb 02, 2007 12:14 am

semika wrote: Εχω λοιπόν μια άλλη απορία στο ίδιο θέμα.
Έστω ότι έχουμε ένα string το οποίο αποτελείται από γράμματα-νούμερα και σημεία στίξης. (Γενικα ότι απεικονίζεται σε ένα πληκτρολόγιο).
Θέλουμε με κάποιο τρόπο να το κρυπτογραφήσουμε αλλά το αποτέλεσμα να είναι printable. Επίσης να υπάρχει δυνατότητα αποκρυπτογράφησης.
Πώς θα το χειριζόσασταν... Ένας υποτυπώδης αλγόριθμος - μια μικρή ιδέα - ένα url είναι αρκετά. Μη χάσετε πολύ χρόνο. Κάτι from the top of your head.

Million Thanks!
Λοιπόν να σου πω πως θα το έκανα εγώ:

Θα χρησιμοποιούσα XOR για να πάρω απο το plain text το cypher text. Αυτό που θα προέκυπτε είναι ένα byte sequence (μερικά θα είναι printable chars και μερικά όχι). Αυτό το byte sequence στην συνέχεια θα το έκανα Base64 encode και θα έπαιρνα ένα printable char text! Το αντίστροφο έχει ως εξής απο το Base64 text -> cypher text -> XOR -> plain text.

Και το XOR αλλά και οι Base64 encoders/decoders είναι full optimized οπότε μιλάμε ότι θα σου παίρνει ελάχιστο χρόνο για το Base64 encode/decode (οπότε μην ανησυχείς για περεταίρω overhead).

Τώρα πέρα απο Base64 μπορείς να χρησιμοποιήσεις κάποια άλλη τεχνική για να κάνεις map bytes σε printable chars (πχ uuencode, binhex κλπ) απλά η Base64 είναι η πιο διαδεδομένη (χρησιμοποιείται για να στέλνουμε οτιδήποτε σαν attach στα mail μας μιας και το SMTP είναι text protocol οπότε τα binary data μεταφέρονται με αυτόν τον τρόπο).

ΥΓ: Γενικά δεν το πολυζάλισα αλλά μπορείς να κάνεις και άλλα hacks ώστε να παίρνεις πάντα printable chars σαν αποτέλεσμα περιορίζοντας λίγο τα κλειδιά που χρησιμοποιείς για την κωδικοποίηση. Καλύτερα όμως να το έχεις χωρίς περιορισμούς για να μην μπορεί εύκολα να γίνει το αρχικό κείμενο compromised.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Fri Feb 02, 2007 10:52 am

Πολύ ωραία! Ευχαριστώ!
Θα το ψάξω και θα σου πω!

Thanks a lot!
User avatar
vangos
Mbyte level
Mbyte level
Posts: 571
Joined: Tue Mar 16, 2004 3:14 pm
Location: Heracleia@UTA

Post by vangos » Fri Feb 02, 2007 12:15 pm

semika wrote:... η αλήθεια είναι ότι μπάινω συχνά αλλά από το γραφείο έχουν απενεργοποιήσει τα scripts και δε μπορώ να κάνω post (Σήμερα είχα άδεια). Μου έχετε λείψει γενικά όλοι!
Semica γεια σου και από μένα. Πολλούς χαιρετισμούς! :-)
Τι ακριβώς εννοείς όταν λες σου έχουν απενεργοποιήσει τα scripts; Δεν μπορείς να χρησιμοποιήσεις κάποιον άλλο browser, που δεν χρειάζεται εγκατάσταση ας πούμε;
User avatar
semika
Mbyte level
Mbyte level
Posts: 998
Joined: Sat May 01, 2004 2:21 pm
Location: Αθήνα - Β.Π.

Post by semika » Sun Feb 04, 2007 8:15 pm

Hello Βαγγέλη!
Δυστυχώς δεν έχω administrative rights στο laptop μου για να εγκαταστήσω άλλο browser.
User avatar
P3
Venus Project Founder
Venus Project Founder
Posts: 2722
Joined: Mon Mar 22, 2004 4:12 pm
Academic status: Alumnus/a
Gender:
Location: !! El Paso !!

Post by P3 » Sun Feb 04, 2007 10:11 pm

Τον FF Μπορείς να τον εγκαταστήσεις σε άλλο φάκελο πέραν του Program Files και να σου δουλευει μια χαρά.Μπορείς να το κάνεις και σαν απλός user. Το έχω δοκιμάσει! Για δες κι εσύ!
"Το δικό μου το ποίημα δεν έχει ομοιοκαταληξία.", ο υπογράφων
Post Reply

Return to “Προγραμματισμός”