Προς το περιεχόμενο

Κρυπτογράφηση και κωδικοποίηση σε C++


Jaco

Προτεινόμενες αναρτήσεις

Δημοσ.

Μπηκα στο πειρασμο να φτιαξω κα εγω ενα προγραμμα κρυπτογραφησης :-). Για να πω την αληθεια δε περιμενα βγει τοσο καλο. Φυσικα ακομα το δουλευω :-( .. αλλα να μια γευση

>keimeno pros kryptografish:
hello world
------------------------------------------
Keimeno ASCII
hello world
------------------------------------------
keimeno se morfi Bytes
104-101-108-108-111-32-119-111-114-108-100-
------------------------------------------
Kryptografimeno keimeno se morfi keimenoy ASCII:
t?kR??cK?}?s?|ncOm?q??*↓kG?N??(c???F`?&^lGm{
------------------------------------------
Kryptografimeno keimeno se morfi bytes:
116-152-107-82-173-164-99-75-188-125-168-115-180-124-110-99-79-109-239-113-188-1
95-42-25-107-71-187-78-211-223-40-99-234-178-244-70-96-204-38-94-108-71-109-123-
------------------------------End-------------------------

keimeno pros kryptografish:
hello world
------------------------------------------
Keimeno ASCII
hello world
------------------------------------------
keimeno se morfi Bytes
104-101-108-108-111-32-119-111-114-108-100-
------------------------------------------
Kryptografimeno keimeno se morfi keimenoy ASCII:
d??]???{∟??O??eb_l?^?s?▬??rM☼??z"??wdo?|??em
------------------------------------------
Kryptografimeno keimeno se morfi bytes:
100-184-169-93-185-150-166-123-28-206-235-79-140-239-101-98-95-108-167-94-192-11
5-224-22-243-148-114-77-15-173-237-122-34-210-187-119-100-111-233-124-172-199-10
1-109-------------------------------End-------------------------

keimeno pros kryptografish:
hello world
------------------------------------------
Keimeno ASCII
hello world
------------------------------------------
keimeno se morfi Bytes
104-101-108-108-111-32-119-111-114-108-100-
------------------------------------------
Kryptografimeno keimeno se morfi keimenoy ASCII:
?;?yi4?\???yd??V?`K?↕?9??⌂???y&s?U?N?t∟??l
------------------------------------------
Kryptografimeno keimeno se morfi bytes:
128-59-231-121-105-52-235-92-172-158-235-121-100-63-231-86-7-159-96-75-200-18-16
4-57-7-215-249-127-147-206-172-121-38-115-188-85-164-78-170-116-28-149-170-108--
-----------------------------End-------------------------

keimeno pros kryptografish:

  • Απαντ. 125
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Πως δουλευει το παραπανω προγραμμα?

Λοιπον, ψαχνοντας στο ιντερνετ δε βρηκα κατι το οποιο να μου κανει, και αυτο γιατι ολλα τα παραδειγματα (στα οποια επεσα) ειχανε περιορισμο στο byte δλδ κεσαρα , αλα charset κλπ. Η μεθοδος να παρεις ενα byte και να το πας 5 θεσεις μπροστα κλπ , κατα την γνομη μου ειναι αχριστη (αν κρυπτογραφησεις το "1111111" και σου βγει "8888888" καταλαβενεις τι παιζει).

 

Στο δικο μου προγραμμα (αν το εχει τρεξει καποιος) θα δει πως, εαν κρυπτογραφησει το (πχ) "hello" 10 φορες, και στοις 10 φορες θα του βγαλει διαφορετικο αποτελεσμα

 

>hello
------------------------------------------
T?hN    ?+q?↔lg?nn_s?bc
------------------------------------------
hello
------------------------------------------
►?.y1?#P?∟?|<∟?u{☼?F
------------------------------------------
hello
------------------------------------------
???S??g?*@h??Gs?mV
------------------------------------------
hello
------------------------------------------
(?-w???o ??zX??o←?`K
------------------------------------------
hello
------------------------------------------
???D↔??^?m?g???Ck??]
------------------------------------------
hello
------------------------------------------
??!|?¶?k ??V(??D???]
------------------------------------------
hello
------------------------------------------
4? S5?,G ?"z?↔mc?<?_
------------------------------------------
hello
------------------------------------------
???E???k?~?~???P?m%V
------------------------------------------
hello
------------------------------------------
??e`e4nk$??y??dt?<bV
------------------------------------------
hello
------------------------------------------
?U[??fk@L?n_?
------------------------------------------
hello
------------------------------------------
???F?▬-y?|?U?Lc\G??P
------------------------------------------

 

Γιατι γινετε αυτο? Γιατι περνω ενα byte και το σκορμαω σε 4 byte τα οποια ειναι random.

Δηλαδη, εστω οτι εχουμε το 'A' (65) byte το οποιο ειναι ετσι

>
0 1  0 0  0 0  0 1 

Εχω μια βαση (η οποια ειναι τυχεα) 4 byte πχ (0χ) 2,55,33,250

>
byte:2 Bits:00000010
byte:55 Bits:00110111
byte:33 Bits:00100001
byte:250 Bits:11111010

Αναλογα το κλειδι (τωρα το δουλευω , και ειναι defualt "01234567") βαζω 1 ζευγος bit σε καθε Byte

>
* Random byte  | bit(for dec)  |  key   | result byte
* 00000010     |   0 1         |  0 1   | 00 00 00 10
* 00110111     |   0 0         |  2 3   | 00 11 00 11
* 00100001     |   0 0         |  4 5   | 00 00 00 01
* 11111010     |   0 1         |  6 7   | 10 11 10 10

Το αποτελεσμα ειναι

>
* 000000[color="Red"]10[/color] 0011[color="red"]00[/color]11 00[color="red"]00[/color]0001 [color="red"]10[/color]111010
* key:01   key:23   key:45   key:67
* bits:01  bits:00  bits:00  bits:01

 

 

Αυτη ειναι η λογικη μου :P !

ειναι σε c# .net 2

 

 

>
using System.IO;
using System.Text;
using System;
using System.Collections;
namespace Cryptography
{
   public class Crypt
   {
       private Random ran;
       public Crypt()
       {
           Iniz();

       }
       public Stream EncryptText(string text, Key key)
       {
           byte[] textBuffer = Encoding.ASCII.GetBytes(text);
           MemoryStream encryptedText = new MemoryStream();
           long step = 0;
           for (int i = 0; i < textBuffer.Length; i++)
           {
               encryptedText.Seek(step, SeekOrigin.Begin);
               encryptedText.Write(Enc(textBuffer[i], key), 0, 4);
               step += 4;
           }
           return encryptedText;
       }
       public string DecryptText(Stream stream, Key key)
       {

           byte[] bigBuffer = new byte[stream.Length / 4];
           long step = 0;
           for (int i = 0; i < stream.Length / 4; i++, step += 4)
           {
               stream.Seek(step, SeekOrigin.Begin);
               byte[] buffer = new byte[4];
               stream.Read(buffer, 0, 4);
               bigBuffer[i] = Dec(buffer, key);
           }
           return Encoding.ASCII.GetString(bigBuffer);
       }
       #region private methods
       private byte[] Enc(byte b, Key key)
       {

           byte[] temp = GetRandom4();
           temp[0] = SetBit(temp[0], GetBit(b, 0), key.key1);
           temp[0] = SetBit(temp[0], GetBit(b, 1), key.key2);

           temp[1] = SetBit(temp[1], GetBit(b, 2), key.key3);
           temp[1] = SetBit(temp[1], GetBit(b, 3), key.key4);

           temp[2] = SetBit(temp[2], GetBit(b, 4), key.key5);
           temp[2] = SetBit(temp[2], GetBit(b, 5), key.key6);

           temp[3] = SetBit(temp[3], GetBit(b, 6), key.key7);
           temp[3] = SetBit(temp[3], GetBit(b, 7), key.key8);

           return temp;
       }
       private byte Dec(byte[] bs, Key key)
       {
           byte temp = 0x0;
           temp = SetBit(temp, GetBit(bs[0], key.key1), 0);
           temp = SetBit(temp, GetBit(bs[0], key.key2), 1);

           temp = SetBit(temp, GetBit(bs[1], key.key3), 2);
           temp = SetBit(temp, GetBit(bs[1], key.key4), 3);

           temp = SetBit(temp, GetBit(bs[2], key.key5), 4);
           temp = SetBit(temp, GetBit(bs[2], key.key6), 5);

           temp = SetBit(temp, GetBit(bs[3], key.key7), 6);
           temp = SetBit(temp, GetBit(bs[3], key.key8), 7);
           return temp;
       }
       private void Iniz()
       {
           ran = new Random();
       }
       #region bit stuffs
       private byte SetBit(byte b, bool bit, int index)
       {
           BitArray temp = new BitArray(8);
           for (int i = 0; i < 8; i++)
               temp.Set(i, GetBit(b, i));
           temp.Set(index, bit);
           byte result = 0;
           for (byte y = 0; y < 8; y++)
               if (temp.Get(y))
                   result |= (byte)(1 << y);
           return result;
       }
       private bool GetBit(byte b, int index)
       {
           bool[] temp = new bool[8];
           int i = 7;
           int bitIndex = 128;
           for (; bitIndex > 0; bitIndex /= 2, i--)
               temp[i] = ((b & bitIndex) == 0x00) ? false : true;
           return temp[index];
       }
       #endregion
       private byte[] GetRandom4()
       {
           return new byte[]
           {
               (byte)ran.Next(0,255),
               (byte)ran.Next(0,255),
               (byte)ran.Next(0,255),
               (byte)ran.Next(0,255),
           };
       }
       #endregion
   }
}

>
namespace Cryptography
{
   public class Key
   {
       public int key1 { get; set; }
       public int key2 { get; set; }
       public int key3 { get; set; }
       public int key4 { get; set; }
       public int key5 { get; set; }
       public int key6 { get; set; }
       public int key7 { get; set; }
       public int key8 { get; set; }
       public static Key CreateDefualtKey()
       {
           return new Key
           {
               key1 = 0,
               key2 = 1,
               key3 = 2,
               key4 = 3,
               key5 = 4,
               key6 = 5,
               key7 = 6,
               key8 = 7
           };
       }
   }
}

 

 

Δημοσ.

Χαίρομαι που αυτό το θέμα ξυπνάει που και που...

 

Διάβασα πρόσφατα το βιβλίο "Κώδικες και μυστικά" του Simon Singh (έχει προταθεί και αλλού)

και το συνιστώ για μια εκλαϊκευμένη προσέγγιση στην κρυπτογράφηση.

 

Κάλυψε ιδανικά την δίψα μου για αλγόριθμους-ασκήσεις τους οποίους φτιάχνω σε ANSI C για ξεσκούριασμα.

 

Καλό κώδικα... και χωρίς μυστικά :-)

  • 4 εβδομάδες αργότερα...
Δημοσ.

Καλησπέρα παιδιά,

 

Μήπως μπορείτε να κάνετε και μια αναφορά σε αλγόριθμο κρυπτογράφησης El Gamal ?

 

Αν έχει κάποιος, κάποιο source code θα ενδιαφερόμουν να του ρίξω μια ματιά! Έχω διαβάσει ότι είναι κάτι παρόμοιο με Diffie-Hellman, αλλά πιό ασφαλές! Γνωρίζεται κάτι περισσότερο? Μπορείτε να μου προτείνετε κάποιο site από το οποίο να μπορώ να έχω σωστή ενημέρωση για τον συγκεκριμένο αλγόριθμο?

 

:-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...