AES in ECB mode
This commit is contained in:
parent
bc0b59dc65
commit
2bf53562bf
4 changed files with 156 additions and 0 deletions
|
@ -21,6 +21,8 @@ pub fn build(b: *std.Build) void {
|
|||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
exe.linkSystemLibrary2("nettle", .{ .needed = true });
|
||||
exe.linkLibC();
|
||||
|
||||
// This declares intent for the executable to be installed into the
|
||||
// standard location when the user invokes the "install" step (the default
|
||||
|
@ -55,6 +57,8 @@ pub fn build(b: *std.Build) void {
|
|||
.target = target,
|
||||
.optimize = optimize,
|
||||
});
|
||||
exe_unit_tests.linkSystemLibrary2("nettle", .{ .needed = true });
|
||||
exe_unit_tests.linkLibC();
|
||||
|
||||
const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);
|
||||
|
||||
|
|
51
src/aes.zig
Normal file
51
src/aes.zig
Normal file
|
@ -0,0 +1,51 @@
|
|||
const std = @import("std");
|
||||
const nettle = @cImport({
|
||||
@cInclude("nettle/aes.h");
|
||||
});
|
||||
|
||||
pub const AES = struct {
|
||||
allocator: std.mem.Allocator,
|
||||
key: []const u8,
|
||||
nettle_ctx: nettle.struct_aes_ctx,
|
||||
|
||||
pub fn init(allocator: std.mem.Allocator, key: []const u8) AES {
|
||||
const owned_key = allocator.dupe(u8, key) catch {
|
||||
@panic("Could not allocate key memory");
|
||||
};
|
||||
|
||||
var aes = AES{
|
||||
.allocator = allocator,
|
||||
.key = owned_key,
|
||||
.nettle_ctx = nettle.struct_aes_ctx{},
|
||||
};
|
||||
|
||||
// this works only in this way: first set encrypt then invert for enabling decrypt
|
||||
// this is not commutative
|
||||
nettle.aes_set_encrypt_key(&aes.nettle_ctx, aes.key.len, aes.key.ptr);
|
||||
nettle.aes_invert_key(&aes.nettle_ctx, &aes.nettle_ctx);
|
||||
|
||||
return aes;
|
||||
}
|
||||
|
||||
/// Encrypt buffer `buf`. Must be integer multiple of keysize.
|
||||
/// Caller must free result.
|
||||
pub fn encrypt(self: @This(), allocator: std.mem.Allocator, buf: []const u8) ![]u8 {
|
||||
const enc = try allocator.alloc(u8, buf.len);
|
||||
|
||||
nettle.aes_encrypt(&self.nettle_ctx, buf.len, enc.ptr, buf.ptr);
|
||||
return enc;
|
||||
}
|
||||
|
||||
/// Decrypt buffer `buf`. Must be integer multiple of keysize.
|
||||
/// Caller must free result.
|
||||
pub fn decrypt(self: @This(), allocator: std.mem.Allocator, buf: []const u8) ![]u8 {
|
||||
const dec = try allocator.alloc(u8, buf.len);
|
||||
|
||||
nettle.aes_decrypt(&self.nettle_ctx, buf.len, dec.ptr, buf.ptr);
|
||||
return dec;
|
||||
}
|
||||
|
||||
pub fn deinit(self: @This()) void {
|
||||
self.allocator.free(self.key);
|
||||
}
|
||||
};
|
37
src/main.zig
37
src/main.zig
|
@ -3,6 +3,7 @@ const b64 = @import("base64.zig");
|
|||
const hex = @import("hex.zig");
|
||||
const xor = @import("xor.zig");
|
||||
const xor_crack = @import("xor_crack.zig");
|
||||
const aes = @import("aes.zig");
|
||||
|
||||
pub fn main() !void {
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
|
@ -36,6 +37,10 @@ pub fn main() !void {
|
|||
if (std.mem.eql(u8, args[1], "s1c6")) {
|
||||
try s1c6(allocator, stdout);
|
||||
}
|
||||
|
||||
if (std.mem.eql(u8, args[1], "s1c7")) {
|
||||
try s1c7(allocator, stdout);
|
||||
}
|
||||
}
|
||||
|
||||
fn s1c1(allocator: std.mem.Allocator, stdout: anytype) !void {
|
||||
|
@ -178,3 +183,35 @@ fn s1c6(allocator: std.mem.Allocator, stdout: anytype) !void {
|
|||
|
||||
try stdout.print("{s}", .{result});
|
||||
}
|
||||
|
||||
fn s1c7(allocator: std.mem.Allocator, stdout: anytype) !void {
|
||||
// prepare input
|
||||
const f = @embedFile("res/7.txt");
|
||||
|
||||
var f_stream = std.io.fixedBufferStream(f);
|
||||
const reader = f_stream.reader();
|
||||
|
||||
var joined_lines = std.ArrayList(u8).init(allocator);
|
||||
defer joined_lines.deinit();
|
||||
const joined_lines_writer = joined_lines.writer();
|
||||
|
||||
while (true) {
|
||||
reader.streamUntilDelimiter(joined_lines_writer, '\n', null) catch |err| {
|
||||
if (err == error.EndOfStream) break else return err;
|
||||
};
|
||||
}
|
||||
|
||||
const input_decoded = try b64.decode(allocator, joined_lines.items);
|
||||
defer allocator.free(input_decoded);
|
||||
|
||||
// decrypt
|
||||
const key = "YELLOW SUBMARINE";
|
||||
|
||||
const cipher = aes.AES.init(allocator, key);
|
||||
defer cipher.deinit();
|
||||
|
||||
const result = try cipher.decrypt(allocator, input_decoded);
|
||||
defer allocator.free(result);
|
||||
|
||||
try stdout.print("{s}", .{result});
|
||||
}
|
||||
|
|
64
src/res/7.txt
Normal file
64
src/res/7.txt
Normal file
|
@ -0,0 +1,64 @@
|
|||
CRIwqt4+szDbqkNY+I0qbDe3LQz0wiw0SuxBQtAM5TDdMbjCMD/venUDW9BL
|
||||
PEXODbk6a48oMbAY6DDZsuLbc0uR9cp9hQ0QQGATyyCESq2NSsvhx5zKlLtz
|
||||
dsnfK5ED5srKjK7Fz4Q38/ttd+stL/9WnDzlJvAo7WBsjI5YJc2gmAYayNfm
|
||||
CW2lhZE/ZLG0CBD2aPw0W417QYb4cAIOW92jYRiJ4PTsBBHDe8o4JwqaUac6
|
||||
rqdi833kbyAOV/Y2RMbN0oDb9Rq8uRHvbrqQJaJieaswEtMkgUt3P5Ttgeh7
|
||||
J+hE6TR0uHot8WzHyAKNbUWHoi/5zcRCUipvVOYLoBZXlNu4qnwoCZRSBgvC
|
||||
wTdz3Cbsp/P2wXB8tiz6l9rL2bLhBt13Qxyhhu0H0+JKj6soSeX5ZD1Rpilp
|
||||
9ncR1tHW8+uurQKyXN4xKeGjaKLOejr2xDIw+aWF7GszU4qJhXBnXTIUUNUf
|
||||
RlwEpS6FZcsMzemQF30ezSJHfpW7DVHzwiLyeiTJRKoVUwo43PXupnJXDmUy
|
||||
sCa2nQz/iEwyor6kPekLv1csm1Pa2LZmbA9Ujzz8zb/gFXtQqBAN4zA8/wt0
|
||||
VfoOsEZwcsaLOWUPtF/Ry3VhlKwXE7gGH/bbShAIKQqMqqUkEucZ3HPHAVp7
|
||||
ZCn3Ox6+c5QJ3Uv8V7L7SprofPFN6F+kfDM4zAc59do5twgDoClCbxxG0L19
|
||||
TBGHiYP3CygeY1HLMrX6KqypJfFJW5O9wNIF0qfOC2lWFgwayOwq41xdFSCW
|
||||
0/EBSc7cJw3N06WThrW5LimAOt5L9c7Ik4YIxu0K9JZwAxfcU4ShYu6euYmW
|
||||
LP98+qvRnIrXkePugS9TSOJOHzKUoOcb1/KYd9NZFHEcp58Df6rXFiz9DSq8
|
||||
0rR5Kfs+M+Vuq5Z6zY98/SP0A6URIr9NFu+Cs9/gf+q4TRwsOzRMjMQzJL8f
|
||||
7TXPEHH2+qEcpDKz/5pE0cvrgHr63XKu4XbzLCOBz0DoFAw3vkuxGwJq4Cpx
|
||||
kt+eCtxSKUzNtXMn/mbPqPl4NZNJ8yzMqTFSODS4bYTBaN/uQYcOAF3NBYFd
|
||||
5x9TzIAoW6ai13a8h/s9i5FlVRJDe2cetQhArrIVBquF0L0mUXMWNPFKkaQE
|
||||
BsxpMCYh7pp7YlyCNode12k5jY1/lc8jQLQJ+EJHdCdM5t3emRzkPgND4a7O
|
||||
NhoIkUUS2R1oEV1toDj9iDzGVFwOvWyt4GzA9XdxT333JU/n8m+N6hs23MBc
|
||||
Z086kp9rJGVxZ5f80jRz3ZcjU6zWjR9ucRyjbsuVn1t4EJEm6A7KaHm13m0v
|
||||
wN/O4KYTiiY3aO3siayjNrrNBpn1OeLv9UUneLSCdxcUqjRvOrdA5NYv25Hb
|
||||
4wkFCIhC/Y2ze/kNyis6FrXtStcjKC1w9Kg8O25VXB1Fmpu+4nzpbNdJ9LXa
|
||||
hF7wjOPXN6dixVKpzwTYjEFDSMaMhaTOTCaqJig97624wv79URbCgsyzwaC7
|
||||
YXRtbTstbFuEFBee3uW7B3xXw72mymM2BS2uPQ5NIwmacbhta8aCRQEGqIZ0
|
||||
78YrrOlZIjar3lbTCo5o6nbbDq9bvilirWG/SgWINuc3pWl5CscRcgQQNp7o
|
||||
LBgrSkQkv9AjZYcvisnr89TxjoxBO0Y93jgp4T14LnVwWQVx3l3d6S1wlsci
|
||||
dVeaM24E/JtS8k9XAvgSoKCjyiqsawBMzScXCIRCk6nqX8ZaJU3rZ0LeOMTU
|
||||
w6MC4dC+aY9SrCvNQub19mBdtJUwOBOqGdfd5IoqQkaL6DfOkmpnsCs5PuLb
|
||||
GZBVhah5L87IY7r6TB1V7KboXH8PZIYc1zlemMZGU0o7+etxZWHgpdeX6JbJ
|
||||
Is3ilAzYqw/Hz65no7eUxcDg1aOaxemuPqnYRGhW6PvjZbwAtfQPlofhB0jT
|
||||
Ht5bRlzF17rn9q/6wzlc1ssp2xmeFzXoxffpELABV6+yj3gfQ/bxIB9NWjdZ
|
||||
K08RX9rjm9CcBlRQeTZrD67SYQWqRpT5t7zcVDnx1s7ZffLBWm/vXLfPzMaQ
|
||||
YEJ4EfoduSutjshXvR+VQRPs2TWcF7OsaE4csedKUGFuo9DYfFIHFDNg+1Py
|
||||
rlWJ0J/X0PduAuCZ+uQSsM/ex/vfXp6Z39ngq4exUXoPtAIqafrDMd8SuAty
|
||||
EZhyY9V9Lp2qNQDbl6JI39bDz+6pDmjJ2jlnpMCezRK89cG11IqiUWvIPxHj
|
||||
oiT1guH1uk4sQ2Pc1J4zjJNsZgoJDcPBbfss4kAqUJvQyFbzWshhtVeAv3dm
|
||||
gwUENIhNK/erjpgw2BIRayzYw001jAIF5c7rYg38o6x3YdAtU3d3QpuwG5xD
|
||||
fODxzfL3yEKQr48C/KqxI87uGwyg6H5gc2AcLU9JYt5QoDFoC7PFxcE3RVqc
|
||||
7/Um9Js9X9UyriEjftWt86/tEyG7F9tWGxGNEZo3MOydwX/7jtwoxQE5ybFj
|
||||
WndqLp8DV3naLQsh/Fz8JnTYHvOR72vuiw/x5D5PFuXV0aSVvmw5Wnb09q/B
|
||||
owS14WzoHH6ekaWbh78xlypn/L/M+nIIEX1Ol3TaVOqIxvXZ2sjm86xRz0Ed
|
||||
oHFfupSekdBULCqptxpFpBshZFvauUH8Ez7wA7wjL65GVlZ0f74U7MJVu9Sw
|
||||
sZdgsLmnsQvr5n2ojNNBEv+qKG2wpUYTmWRaRc5EClUNfhzh8iDdHIsl6edO
|
||||
ewORRrNiBay1NCzlfz1cj6VlYYQUM9bDEyqrwO400XQNpoFOxo4fxUdd+AHm
|
||||
CBhHbyCR81/C6LQTG2JQBvjykG4pmoqnYPxDyeiCEG+JFHmP1IL+jggdjWhL
|
||||
WQatslrWxuESEl3PEsrAkMF7gt0dBLgnWsc1cmzntG1rlXVi/Hs2TAU3RxEm
|
||||
MSWDFubSivLWSqZj/XfGWwVpP6fsnsfxpY3d3h/fTxDu7U8GddaFRQhJ+0ZO
|
||||
dx6nRJUW3u6xnhH3mYVRk88EMtpEpKrSIWfXphgDUPZ0f4agRzehkn9vtzCm
|
||||
NjFnQb0/shnqTh4Mo/8oommbsBTUKPYS7/1oQCi12QABjJDt+LyUan+4iwvC
|
||||
i0k0IUIHvk21381vC0ixYDZxzY64+xx/RNID+iplgzq9PDZgjc8L7jMg+2+m
|
||||
rxPS56e71m5E2zufZ4d+nFjIg+dHD/ShNPzVpXizRVUERztLuak8Asah3/yv
|
||||
wOrH1mKEMMGC1/6qfvZUgFLJH5V0Ep0n2K/Fbs0VljENIN8cjkCKdG8aBnef
|
||||
EhITdV7CVjXcivQ6efkbOQCfkfcwWpaBFC8tD/zebXFE+JshW16D4EWXMnSm
|
||||
/9HcGwHvtlAj04rwrZ5tRvAgf1IR83kqqiTvqfENcj7ddCFwtNZrQK7EJhgB
|
||||
5Tr1tBFcb9InPRtS3KYteYHl3HWR9t8E2YGE8IGrS1sQibxaK/C0kKbqIrKp
|
||||
npwtoOLsZPNbPw6K2jpko9NeZAx7PYFmamR4D50KtzgELQcaEsi5aCztMg7f
|
||||
p1mK6ijyMKIRKwNKIYHagRRVLNgQLg/WTKzGVbWwq6kQaQyArwQCUXo4uRty
|
||||
zGMaKbTG4dns1OFB1g7NCiPb6s1lv0/lHFAF6HwoYV/FPSL/pirxyDSBb/FR
|
||||
RA3PIfmvGfMUGFVWlyS7+O73l5oIJHxuaJrR4EenzAu4Avpa5d+VuiYbM10a
|
||||
LaVegVPvFn4pCP4U/Nbbw4OTCFX2HKmWEiVBB0O3J9xwXWpxN1Vr5CDi75Fq
|
||||
NhxYCjgSJzWOUD34Y1dAfcj57VINmQVEWyc8Tch8vg9MnHGCOfOjRqp0VGyA
|
||||
S15AVD2QS1V6fhRimJSVyT6QuGb8tKRsl2N+a2Xze36vgMhw7XK7zh//jC2H
|
Loading…
Add table
Reference in a new issue