Jump to content

Konkurss 5 (closed)


0xDEAD BEEF
 Share

Recommended Posts

0xDEAD BEEF

Šodienas konkurs ir par AES.

Es izvēlējos random stringu 16 simbolus (tas arī ir atbilde) (a-z lowercase) garu, un nokriptēju izmantojot AES-128 ar programmu, ko fiksi uzrakstīju C# Visual Studio 2010. Programas output es saglabāju failā. Lūk faila saturs:

 

plain - ********************************

key - ********************************

encrypted - 2a842138e8c02d1cd561c21d67f958ce

 

5e9078c024f1b1c3d002d8f1ced09de0 <-- slikts :(

 

Kā redzat - ir notikusi liela nelaime. Manam datoram uzbruka nelāga sērga - "bit rotting". Interesantie baiti pārvērtās par zvaigznītēm. pamāciet mani latviešu valodas gramatikas lietošanā man uzzināt, kādu stringu es enkriptēju šorīt .. :(

Zemāk pievienoju arī programmas kodu, bet šķiet, ka arī to ir piemeklējusi "bit rot" nelaime.

 

Balvu fonds:

* Pirmā vieta 10Ls

 

whiteCryption darbinieki piedalīties nedrīkst.

Balvu saņem pirmais dalībnieks, kurš iepostē pareizo atbildi (skat. zemāk atbildes formātu) (iepostēšanas laiks tiek uzskatīts pēdējais posta edit laiks).

 

Konkursa beigu termiņš - 28. aprīlis (2012), 23:59 LV laiks.

 

Atbilde ir jaiepostē šajā topikā šādā formā (lai citiem ari būtu interesanti):

 

"niks <atstarpe> SHA1(niks + atbilde)". + ir stringu kontaktenācija. Lūdzu lietojiet nikam ANSII lowercase un sha1 160 bitu variantu.

Piemēram: 0xdeadbeef 0f80010725b1a67fc11c43a787e04407698cf1bb (ja atbilde būtu bijusi "abcdefghijklmnop").

 

Kā vienmēr - uzvarētājs sūta man (PM) savu vārdu un uzvardu, kā arī p.k. (obligāts lauks DNB bankā) un bankas konta numuru, lai saņemtu balvu!

 

---- KONKURSS IR NOSLĒDZIES!!! APSVEICAM Vilx- AR UZVARU!!! STAY TUNED! RĪT 12:00 LV LAIKS NĀKAMAIS KONKURSS!!! ----

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace KonkurssAES
{
class Program
{
	static string ByteToHex(byte[] data)
	{
		string retVal = string.Empty;
		for (int i = 0; i < data.Length; i++)
		{
			retVal = retVal + string.Format("{0:x2}", data[i]);
		}
		return retVal;
	}
	static void Main(string[] args)
	{
		string plainText = "****************";
		byte[] plain = Encoding.GetEncoding("ISO-8859-1").GetBytes(plainText);
		byte[] encrypted = null;
		byte[] key = new byte[16];
		Random rand = new Random();
		rand.NextBytes(key); // izmantojam random atslegu
		using (RijndaelManaged rijAlg = new RijndaelManaged())
		{
			rijAlg.Key = key;
			rijAlg.IV = new byte[16]; // init vektors visas nules
			rijAlg.Padding = PaddingMode.None;

			ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
			using (MemoryStream msEncrypt = new MemoryStream())
			{
				using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
				{
					csEncrypt.Write(plain, 0, plain.Length);
				}
				encrypted = msEncrypt.ToArray();
			}
		}
		Console.WriteLine("plain	 - {0}", ByteToHex(plain));
		Console.WriteLine("key	   - {0}", ByteToHex(key));
		Console.WriteLine("encrypted - {0}", ByteToHex(encrypted));
	}
}
}

 

Veiksmi,

Beefs

Edited by Vilx-
Link to comment
Share on other sites

Konkursa uzdevumu ievieto

Balvu fonds:

* Pirm vieta 10Ls

Ka vienmer - uzvaretajs suta man (PM) savu vardu un uzvardu, ka ari p.k. un bankas konta numuru, lai sanemtu balvu!

--- KONKURSS IR NOSLEDZIES! APSVEICAM UZVARETAJU kirils! STAY TUNED! RIT (25. APR. 2012. 12:00 LV laiks!) NAKAMAIS KONKURSS!!! ---

 

Veiksmi,

Beefs

 

šis man patīk. :D

Link to comment
Share on other sites

Uģis Lācis

Oh boy, Kirils arī šodien ir šeit.

 

Nu ok, ja uzdevums būs balstīts uz ne-pārcilvēcisku loģiku un var izlīdzēties ar skaitliksām manipulācijām, tad Kirils paņems šo ar. Jāatzīst, ka Tavs ātrums, Kiril, ir gana iespaidīgs. Žetons.

Link to comment
Share on other sites

Draugs, Tev ir bugs programmā! Pusi dienas noņēmos nesaprasdams, kāpēc nesanāk. Līdz atkodu -

 

swEncrypt.Write(plain);

 

Šis ieraksta strīmā tekstu "System.Byte[]". Nevis Tavu ūberparoli. :p

Link to comment
Share on other sites

0xDEAD BEEF

Nope, viss ir pareizi. Es to stringu konverteju uz ascii 8bit 16baiti augsha (kur pieskir plain) un ierakstu strima 16 baitu buferi, nebis stringu (kas viss drizak tiktu serializets ka 4 baiti garums + 16 * 2 unicode burti).

Beefs

edit: plainText bija mana uber parole, bet del bit rota parvertas par ****

Edited by 0xDEAD BEEF
Link to comment
Share on other sites

Nope, viss ir nepareizi. Tu raksti čerez StreamWriter, kas paredzēts teksta ierakstīšanai. Write() metodei nav overloada, kurš ņemtu pretī baitu masīvu.

P.S. Saprotu par to **** bitrotu, par to nav jautājums.

 

Ja nu kas, tad StreamWriter pēc defaulta izmanto UTF-8, un nekādus terminatorus. Tātad,

swEncrypt.Write(plainText);

patiesībā darītu to, ko Tu īstenībā gribi. Ja netici, padebugo, un paskaties, kas tajā MemoryStream nonāk, ja izvāc CryptoStream no vidus ārā. Es to jau izdarīju, tāpēc esmu drošs par to, ko saku.

 

 

Ā, un ja vien Tu neuzliksi

rijAlg.Padding = PaddingMode.None;

, tad viņš uzģenerēs divus output blokus, nevis vienu, pat pareizajā variantā. Neesmu īsti drošs, kāpēc tā.

Edited by Vilx-
Link to comment
Share on other sites

Ā, un ja vien Tu neuzliksi

rijAlg.Padding = PaddingMode.None;

, tad viņš uzģenerēs divus output blokus, nevis vienu, pat pareizajā variantā. Neesmu īsti drošs, kāpēc tā.

Я тупой и ничего не знаю... Beeet... Defaultā paddings ir PKCS7:

The PKCS #7 padding string consists of a sequence of bytes, each of which is equal to the total number of padding bytes added.

The following example shows how these modes work. Given a blocklength of 8, a data length of 9, the number of padding octets equal to 7, and the data equal to FF FF FF FF FF FF FF FF FF:

Data: FF FF FF FF FF FF FF FF FF

PKCS7 padding: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

Attiecīgi ja ir viens pilns bloks datu, tad paddingu tajā pašā blokā nav kur likt, tāpēc tiek pievienots vēl viens bloks, kam PKCS7 gadījumā visi baiti ir 0xA0 (pieņemot, ka bloka izmērs ir 128 biti).

 

A vispār esmu saguris un nejūtos īsti vesels - neņem ļaunā, ja kaut ko samuldējos.

Link to comment
Share on other sites

IMHO, ja ir precīzi piepildīti visi bloki, tad nevajadzētu būt vispār paddingam... bet go figure. Tagad arī lauž meklēt dokumentāciju. :D

 

Un, pēdējais punkts uz "i" - ja galīgi man netici, tad es nupat atkodu atslēgu. Lūk, kods, ar kuru vari pārbaudīt, ka Tev tur ierakstījies ne tas:

 

static void Main(string[] args)
{
byte[] encrypted = new byte[] { 0x5e, 0x90, 0x78, 0xc0, 0x24, 0xf1, 0xb1, 0xc3, 0xd0, 0x02, 0xd8, 0xf1, 0xce, 0xd0, 0x9d, 0xe0 };
byte[] key = new byte[] { 0x64, 0x11, 0xf7, 0x89, 0xcd, 0x96, 0x10, 0x6d, 0x96, 0xd6, 0x57, 0x8e, 0xf1, 0x82, 0x1b, 0x46 };
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
	rijAlg.Key = key;
	rijAlg.IV = new byte[16]; // init vektors visas nules
	ICryptoTransform encryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
	using (MemoryStream msEncrypt = new MemoryStream(encrypted))
	{
		using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Read))
		{
			using (StreamReader srEncrypt = new StreamReader(csEncrypt))
			{
				Console.WriteLine(srEncrypt.ReadToEnd());
			}
		}
	}
}
}
// Output: System.Byte[]

 

He, ja tā padomā, es pat esmu izpildījis uzdevumu, jo jautāts bija - "kādu stringu esmu enkriptējis". Tu enkriptēji "System.Byte[]". :p

 

Ak, jā pareizais formāts. SHA1 128-bitu versiju nevarēju nekur atrast, pat wikipēdija par tādu klusē, tāpēc izmantoju parasto SHA1 160-bitu.

 

vilx- dff675897ffecd4553fbfbe91fd21f0a69a29ebb

Edited by Vilx-
Link to comment
Share on other sites

0xDEAD BEEF

Lol! :)

Paldies Vilx! Viss izkatījās ļoti skaisti, bet tas dranķis mani piečakarēja. Ar padding - tur ir 2vi bloki tādēļ, ka ja tu ieraksti pilnu bloku, tad viņš pievieno klāt vēl vienu ar 16mitniekiem (ar ideju, ka var zināt, ka tas bloks ir tukšš jo padding pasaka, cik baiti ir aizpildīti).

Es izlabošu kodu. Rīt no rīta pārbaudīšu atslēgu. Tikmēr - es pamainiju tekstus - parisini ar tiem! ;)

Beefs

Link to comment
Share on other sites

Ai, sajaucu - nevis 0xA0, bet 0x10 būs pareizais...

 

IMHO, ja ir precīzi piepildīti visi bloki, tad nevajadzētu būt vispār paddingam... bet go figure. Tagad arī lauž meklēt dokumentāciju. :D

Un tagad iedomājies, ka tev ir šāds bloks ar datiem:

0x10 0x0F 0x0E 0x0D 0x0C 0x0B 0x0A 0x09 0x08 0x07 0x06 0x05 0x04 0x03 0x02 0x01

Pēc tavas loģikas, kas ir pēdējais baits? Paddings, kas nozīmē, ka reālo datu daudzums ir 15 baiti? Vai tomēr dati, kas nozīmē, ka ir "precīzi piepildīti visi bloki"? Grozies kā gribi, bet ja ir iespējams patvaļīgs datu daudzums (t.i., pēdējais bloks var nebūt pilns), tad paddingu vajag, un pilnu bloku gadījumā tam ir nepieciešams ekstra bloks

Edited by binary
Link to comment
Share on other sites

0xDEAD BEEF

Tas pkcs-7 ir piepildīts ar brīvo skaitu lidz beigām. Tādēļ vienmēr var ņemt pēdējā bloka pēdējo baitu. Ja tas ir 16, tas nozīmē, ka viss bloks ir izmantots paddingam.

Beefs

 

Vilx, Tu man PM atsūtiji pareizi atbildi, bet tevis iepostēto hash gan es nekādi nevaru dabūt sakrist ar manis aprēķināto. Un starpcitu - vai tu esi uzinstalējis uz mana PC trojāni?

Beefs

Edited by 0xDEAD BEEF
Link to comment
Share on other sites

vilkam taisnība būtībā, bet ar sha1 viņam gan neiet. :D

 

te ir propercase atbilde: kirils d90cf56068d2bbec2aa73ec12b0683b6fcd431be

un te ir lowercase atbilde: kirils fb979976a3d6ebb8bd8bccb6e846391120706e54

Link to comment
Share on other sites

0xDEAD BEEF

Nez, Kiril! Man tavi sha ari nesakrit ar atbildi... :/

Beefs

edit: vajadzētu sanākt "0xdeadbeef c6a82cd09c66fbfb7107d53217f1399381346570"

Edited by 0xDEAD BEEF
Link to comment
Share on other sites

Es dikti steidzos, moš būšu nomudījies. Vai arī moš tas tāpēc, ka tur ir arī mīnusa zīme un atstarpe tajā stringā. Rekur, outputs no DAMN Hash Calculator:

Calculating hash of 22 bytes string `vilx- ****************`...

 

SHA-160 : E2C1ADF6512A652DF3B7634F223CC8B9534C1F58

 

Calculation took 0.000 seconds

Edited by Vilx-
Link to comment
Share on other sites

0xDEAD BEEF

Jā! Viss pareizi, vilx! Mums ir uzvarētājs!!!

Vienīgi, Tu ieliki "- ", ko es galīgi negaidīju, es izmēģinājos ar "-" un ar " ' un ar "Vilx" un ar "vilx" (aizmirstam par kommatiem).

Viss pareizi! Tu esi uzvarējis! Tagad, lūdzu, pasaki man, kā Tu to izdarīji 3 minūtēs, jo es reāli estimeitoju šito uz 30+ minūtes cpu laika.

Beefs

Edited by 0xDEAD BEEF
Link to comment
Share on other sites

Par vēlu. :( Jau pastāstīju, pirms izlasīju Tavu komentāru. Tā kā neviens cits tāpat droši vien šito nerisinās, tad iepostēšu savu softu un pareizo atbildi šeit.

 

 

Atbilde: hrunxpiynnayqqqr

 

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.IO;
namespace CSTest
{
   public static class Program
   {
    static string ByteToHex(byte[] data)
    {
	    string retVal = string.Empty;
	    for (int i = 0; i < data.Length; i++)
		    retVal = retVal + string.Format("0x{0:x2},", data[i]);
	    return retVal;
    }
    static void Main(string[] args)
    {
	    new System.Threading.Thread(Program.CheckThread).Start(0);
	    new System.Threading.Thread(Program.CheckThread).Start(1);
	    new System.Threading.Thread(Program.CheckThread).Start(2);
	    new System.Threading.Thread(Program.CheckThread).Start(3);
    }
    static void CheckThread(object start)
    {
	    byte[] plain = new byte[16];
	    byte[] encrypted = new byte[] { 0x2a, 0x84, 0x21, 0x38, 0xe8, 0xc0, 0x2d, 0x1c, 0xd5, 0x61, 0xc2, 0x1d, 0x67, 0xf9, 0x58, 0xce, };
	    byte[] key = new byte[16];
	    RijndaelManaged rijAlg = new RijndaelManaged();
	    var iv = new byte[16]; // init vektors visas nules;
	    rijAlg.Padding = PaddingMode.None;
	    rijAlg.IV = iv;
	    for (int i =(int)start; i < int.MaxValue; i+=4)
	    {
		    Random rand = new Random(i);
		    rand.NextBytes(key); // izmantojam random atslegu
		    rijAlg.Key = key;

		    rijAlg.CreateDecryptor(key, iv).TransformBlock(encrypted, 0, 16, plain, 0);
		    bool check = true;
		    for (int j = 0; j < 16; j++)
			    if (plain[j] < 'a' || plain[j] > 'z')
			    {
					    check = false;
					    break;
			    }
		    if (check)
		    {
			    Console.WriteLine("Found!!! {0}", System.Text.Encoding.ASCII.GetString(plain));
			    Console.WriteLine(i);
			    Console.WriteLine("Key: {0}", ByteToHex(key));
			    System.Diagnostics.Process.GetCurrentProcess().Kill();
		    }
		    if (i % 1000000 < 4)
			    Console.WriteLine(i);
	    }
	    Console.WriteLine("Not found. ");
    }
   }
}

 

Edited by Vilx-
Link to comment
Share on other sites

0xDEAD BEEF

Patiesībā - Vilx risinājums ir elegants un ātrs. Tas, ko es gadīju, tikai uber formā. Bet - kas mani patiešām interesē ir - kādus pigorus izdomāja Kirils?! :)

Beefs

Link to comment
Share on other sites

pag, es pareizi lasu vilx kodu? vienkārši pārlasam random atslēgas vērtības?

Patiesībā - Vilx risinājums ir elegants un ātrs. Tas, ko es gadīju, tikai uber formā. Bet - kas mani patiešām interesē ir - kādus pigorus izdomāja Kirils?! :)

Beefs

es šī uzdevuma risināšanu laicīgi atmetu. man nav C# vides uz datora, bet simulēt visas specifikas citā valodā būtu ilgi. beef, sha1sum("kirilsSystem.Byte[]")

Link to comment
Share on other sites

0xDEAD BEEF

Sure. Es pielavu kludu, rakstot programmu. Vilx noradija uz kludu, tadel es pielaboju programmu (konkursa uzdevumu) ka rezultata ari mainijas output dati. BTW - Vilx iesutija atrisinajumu 3 minusu laika pec tam, kad biju publicejis izmainas ar pareizo kodu un vertibas. Es biju loti parsteigts par tik atru atbildi! :)

Beefs

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...