inital commit

This commit is contained in:
Paul 2020-10-18 13:48:50 +02:00
commit d33c7d31d0
24 changed files with 417 additions and 0 deletions

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

11
.idea/artifacts/AES_CTR_jar.xml generated Normal file
View File

@ -0,0 +1,11 @@
<component name="ArtifactManager">
<artifact type="jar" name="AES_CTR:jar">
<output-path>$PROJECT_DIR$/out/artifacts/AES_CTR_jar</output-path>
<root id="archive" name="AES_CTR.jar">
<element id="directory" name="META-INF">
<element id="file-copy" path="$PROJECT_DIR$/META-INF/MANIFEST.MF" />
</element>
<element id="module-output" name="AES_CTR" />
</root>
</artifact>
</component>

1
.idea/description.html generated Normal file
View File

@ -0,0 +1 @@
<html>Simple <b>Java</b> application that includes a class with <code>main()</code> method</html>

6
.idea/encodings.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

12
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="ProjectKey">
<option name="state" value="project://e2804f05-5315-4fc6-a121-c522a6c26470" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_14" default="true" project-jdk-name="14" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/AES_CTR.iml" filepath="$PROJECT_DIR$/AES_CTR.iml" />
</modules>
</component>
</project>

3
.idea/project-template.xml generated Normal file
View File

@ -0,0 +1,3 @@
<template>
<input-field default="com.company">IJ_BASE_PACKAGE</input-field>
</template>

12
AES_CTR.iml Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

BIN
AES_CTR.jar Normal file

Binary file not shown.

3
META-INF/MANIFEST.MF Normal file
View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: tech.loedige.Main

4
Readme.txt Normal file
View File

@ -0,0 +1,4 @@
Name: Paul Lödige
Matrikel Nr.: 15405036
Projekt als ausführbare jar-Datei vorhanden

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,10 @@
package tech.loedige;
public class AdditiveStreamCipher {
static public void encrypt(KeyStreamGenerator ksg, byte[] m) {
for (int i = 0; i < m.length; ++i) {
m[i] ^= ksg.getNextKeyStreamByte(m[i]);
}
}
}

View File

@ -0,0 +1,12 @@
package tech.loedige;
public abstract class KeyStreamGenerator {
/**
* Berechnung des nächsten Schlüsselstrombytes.
* (Entspricht einem einmaligen Aufruf der
* Update-Funktion s und der Extraktions-Funktion S.)
*
* @return Nächstes Schlüsselstrombyte
*/
abstract byte getNextKeyStreamByte(byte mByte);
}

View File

@ -0,0 +1,64 @@
package tech.loedige;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class KeyStreamGenerator_AES_CTR extends KeyStreamGenerator {
private Cipher cipher;
private final byte[] state = new byte[16];
private final byte[] ctr = new byte[16];
private int currentByte=0;
public void initState(byte[] key, byte[] iv)
throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
if((iv.length!=16)||(key.length!=16)){
throw new IllegalArgumentException("Invalid input length");
}
System.arraycopy(iv,0,ctr,0,16);
SecretKey secretKey = new SecretKeySpec(key,"AES");
cipher = Cipher.getInstance("AES/ECB/NOPADDING");
cipher.init(Cipher.ENCRYPT_MODE,secretKey);
System.arraycopy(cipher.doFinal(ctr),0,state,0,16);
}
@Override
byte getNextKeyStreamByte(byte mByte) {
if(currentByte>=16){
try {
updateStateBlock();
} catch (BadPaddingException | IllegalBlockSizeException e) {
e.printStackTrace();
}
currentByte=0;
}
return state[currentByte++];
}
private void updateStateBlock()
throws BadPaddingException, IllegalBlockSizeException {
incrementCtr();
System.arraycopy(cipher.doFinal(ctr),0,state,0,16);
}
/**
* inkrementiert den counter
*/
private void incrementCtr(){
for(int i = 0; i<16; i++){
//falls das Byte die volle Länge erreicht hat findet ein Übertrag statt
if(ctr[i]==0xff){
ctr[i]=0x00;
}
else{
//falls das Byte nicht die volle Länge hat endet die Inkrementierung
ctr[i]++;
return;
}
}
}
}

View File

@ -0,0 +1,33 @@
package tech.loedige;
import util.Dump;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Main {
public static void main(String[] args)
throws Exception {
byte[] key = Dump.hexString2byteArray("0102030405060708090A0B0C0D0E0F10");
SecretKey secretKey = new SecretKeySpec(key, "AES");
Cipher cipher= Cipher.getInstance("AES/CTR/NOPADDING");
byte[] ctr = Dump.hexString2byteArray("FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE");
IvParameterSpec iv = new IvParameterSpec(ctr);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] m = new byte[35];
byte[] c = cipher.doFinal(m);
System.out.println("AES-CTR-Verschlüsselung mit "+
"Cipher-Instanz vom Typ AES/CTR/NOPADDING:");
System.out.println(Dump.dump(c));
System.out.println();
KeyStreamGenerator_AES_CTR ksg= new KeyStreamGenerator_AES_CTR();
ksg.initState(key, ctr);
AdditiveStreamCipher.encrypt(ksg, m);
System.out.println("AES-CTR-Verschlüsselung mit "+ "KeyStreamGenerator_AES_CTR-Implementierung:");
System.out.println(Dump.dump(m));
System.out.println();
}
}

215
src/util/Dump.java Normal file
View File

@ -0,0 +1,215 @@
/*
* Stefan Heiss
* TH Ostwestfalen-Lippe
* FB Elektrotechnik und Technische Informatik
* Quellcode zur Lehrveranstaltung Datensicherheit
*/
package util;
import java.math.BigInteger;
import java.util.Formatter;
public class Dump {
public final static String NL
= System.getProperty("line.separator", "\r\n");
public static byte[] hexString2byteArray(
String hexString) {
// remove all whitespaces
hexString = hexString.replaceAll("\\s", "");
hexString = hexString.replaceAll(":", "");
if ((hexString.length() & 0x01) != 0) {
throw new IllegalHexDumpException(
"Odd number of nibbles!");
}
int byteArrayLength = hexString.length() >> 1;
byte[] ba = new byte[byteArrayLength];
for (int i = 0; i < byteArrayLength; ++i) {
try {
ba[i]
= (byte) Integer.parseInt(
hexString.substring(2 * i, 2 * i + 2), 16);
} catch (NumberFormatException nfe) {
throw new IllegalHexDumpException(
"Invalid characters "
+ hexString.substring(2 * i, 2 * i + 2)
+ " at position " + 2 * i
+ " (of streamlined string)!");
}
}
return ba;
}
// ------------------------------------------------------
public static String dumpString(int i) {
String retString = Integer.toString(i, 16);
if ((retString.length() & 0x01) != 0) {
retString = "0" + retString;
}
return retString.toUpperCase();
}
public static String dumpString(byte b) {
return dumpString(b & 0xff);
}
public static String dumpString(byte[] data) {
return dumpString(data, 0, data.length);
}
public static String dumpString(
byte[] data, int offset, int length) {
return dumpString(data, "", offset, length);
}
public static String dumpString(
byte[] data, String interBytesString,
int offset, int length) {
if (offset < 0 || length < 0) {
throw new IllegalArgumentException(
"Values for offset and parameters must be "
+ "non-negative!");
}
if (data == null) {
if (offset > 0 || length > 0) {
throw new IllegalArgumentException(
"Specified range not available in data!");
}
return "";
}
if ((offset + length) > data.length) {
throw new IllegalArgumentException(
"Specified range not available in data!");
}
StringBuffer sb = new StringBuffer(length
* (2 + interBytesString.length()));
for (int i = offset; i < offset + length; ++i) {
if (i != 0) {
sb.append(interBytesString);
}
sb.append(dumpString(data[i]));
}
return new String(sb);
}
// ------------------------------------------------------
public static String dump(BigInteger b) {
byte[] data = b.toByteArray();
int l = data.length;
if (l > 1 && data[0] == 0) {
System.arraycopy(data, 1, data, 0, --l);
}
return dump(data, l);
}
public static String dump(byte[] data) {
return dump(data, data.length);
}
public static String dump(byte[] data, int length) {
StringBuffer sb
= new StringBuffer(78 * ((length + 15) >> 4));
char[] txt = new char[16];
int i = 0;
for (; i < length;) {
if ((i & 0x0f) == 0) {
sb.append(alignRight(
Integer.toHexString(i) + " ", 9, '0'));
}
int temp = (0xff & data[i]);
sb.append(dumpString(temp));
sb.append(" ");
if (temp < 0x20 || temp > 0x7e) /// ???
{
txt[i++ & 0x0f] = '.';
} // if( temp == 0x0a || temp == 0x09 || temp == 0x0d ) /// ???
// txt[i++ & 0x0f] = (char)0;
else {
txt[i++ & 0x0f] = (char) temp;
}
if ((i & 0x0f) == 0) {
sb.append(" ");
sb.append(txt, 0, 16);
sb.append(NL);
}
}
if (i == 0) // empty data
{
sb.append("000000 ");
}
if ((i = (i & 0x0f)) != 0) {
sb.append(fillString(3 * (16 - i), ' ') + " ");
sb.append(txt, 0, i);
sb.append(NL);
}
return new String(sb.toString().trim());
}
/**
* @return If str.length() < totalLength, a String of
* length totalLength is returned. (The original String
* extended by specified character from the left.)
*/
public static String alignRight(
String str, int totalLength, char fillChar) {
if (totalLength <= str.length()) {
return str;
}
return fillString(totalLength - str.length(), fillChar)
+ str;
}
/**
* @return If str.length() < totalLength, a String of
* length totalLength is returned. (The original String
* extended by space characters from the left.)
*/
public static String alignRight(
String str, int totalLength) {
return alignRight(str, totalLength, ' ');
}
/**
* @return A String of repLength many repetitions of
* specified character.
*/
public static String fillString(
int spaceLength, char fillChar) {
if (spaceLength < 0) {
spaceLength = 0;
}
StringBuffer sb = new StringBuffer(spaceLength);
for (int i = 0; i < spaceLength; ++i) {
sb.append(fillChar);
}
return new String(sb);
}
// ------------------------------------------------------
public static String dumpIntArray(int[] array) {
int nosPerLine = 4;
StringBuffer sb = new StringBuffer();
Formatter formatter = new Formatter(sb);
for (int i = 0; i < array.length; ++i) {
if (i != 0 && i % nosPerLine == 0) {
sb.append(NL);
}
formatter.format(" %08x", array[i]);
}
sb.append(NL);
return new String(sb);
}
}

View File

@ -0,0 +1,15 @@
/*
* Stefan Heiss
* TH Ostwestfalen-Lippe
* FB Elektrotechnik und Technische Informatik
* Quellcode zur Lehrveranstaltung Datensicherheit
*/
package util;
public class IllegalHexDumpException
extends IllegalArgumentException {
public IllegalHexDumpException(String s) {
super(s);
}
}