SHA-256

1,976
68
221
Дело было вечером, делать было нечего...
Сидел я, листал ресурсы Ботании, ничего не предвещало беды, как вдруг я натыкаюсь на загадочный файл flightTiara9.png и сопутствующий ему flightTiara9.png.mcmeta. Смотрю, а там какие-то закорючки нарисованы, вроде потока символов в фильме "Матрица", анимированные естественно.
Уж сколь плохо я знаю Ботанию, но моя уверенность в отсутствии данной текстуры в креативном инвентаре (равно как и в NEI) была ещё больше уверенности Ким Чен Ына в своей крутости.
Так и оказалось - видов крыльев всего 9 (0-8). Но я ведь тоже не лыком шитый, взял да прописал /give на 9ю мету. И что бы вы думали? Как и следовало ожидать, в мои распростёртые длани подобно заповедям господньим прямо с небес упали мистические девятые крылья. "Что за фигня? ", - подумал я, - "откуда они взялись и как их скрафтить? ". Ткнул в великую магическую кнопочку 'R' - ничего, будто в землю потыкал, разве что палец чистый остался.
Но я ведь великий программист, я же могу посмотреть в код ботании! Ага, вот и оно, 
ItemFlightTiara.class[/b]]
Код:
@Override
	public void onEquipped(ItemStack stack, EntityLivingBase player) {
		super.onEquipped(stack, player);
		if(stack.getItemDamage() != WING_TYPES && hash(stack.getDisplayName()).equals("16E1BDFD1D6AE1A954C9C5E1B2D9099780F3E1724541F1F2F77310B769CFFBAC")) {
			stack.setItemDamage(WING_TYPES);
			stack.getTagCompound().removeTag("display");
		}
	}

	String hash(String str) {
		if(str != null)
			try {
				MessageDigest md = MessageDigest.getInstance("SHA-256");
				return new HexBinaryAdapter().marshal(md.digest(salt(str).getBytes()));
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			}
		return "";
	}

	// Might as well be called sugar given it's not secure at all :D
	String salt(String str) {
		str = str += "wowsuchsaltmuchsecurityverywow";
		SecureRandom rand = new SecureRandom(str.getBytes());
		int l = str.length();
		int steps = rand.nextInt(l);
		char[] chrs = str.toCharArray();
		for(int i = 0; i < steps; i++) {
			int indA = rand.nextInt(l);
			int indB;
			do {
				indB = rand.nextInt(l);
			} while(indB == indA);
			char c = (char) (chrs[indA] ^ chrs[indB]);
			chrs[indA] = c;
		}

		return String.copyValueOf(chrs);
	}
Мистика тут же отправилась в неведомом направлении на поиски более наивных жертв.
Всё просто, ясно и понятно - уберхитрый Вязкий решил не искать лёгких путей по выдаче интересных предметов только себе любимому и написал оверсложный код на шифровку кастомного названия предмета по SHA-256, в результате чего только последователи Сатаны и адепты тайного ордена Ботании могут легальным путём получить эти самые 9е крылья, алсо именуемыми Matrix Wings.
Ну а я что? Я ничего, я пошёл к великому и всезнающему (нет, не Мерлину) гуглу, искать может кто-то таки смог расшифровать сей хеш, ну или предал Вазки и слил ключ в паблик.
Спустя пару часов бессмысленных блужданий во всякий реддитах и изучения радужных списков, я понял, что на стороне мне не помогут - Вязкий юзал соль.
А поскольку решения так не нашлось, я решил попытать счастье своими силами, написал кучу вложенных циклов, больше чем у меня задолженностей по учёбе, и давай брутфорсить по всем 256 вариантам записи char. Минут через пять я убил процесс, т.к. он повис как МакКуин и не отвечал ни на что. Был ещё вариант - онлайн компиляторы, но они точно так же поступали с моим великим брутокодом, только в 60 раз быстрее.
Я решил почитать, как экономить память и все дела, нашёл инфу по StringBuilder'у, всё вроде бы хорошо, но вот загвоздка: как написать человеческий алгоритм, который бы выполнялся не весь разом, а постепенно, а ещё лучше мог быть остановлен в любом момент и запущен вновь?
Ответ: сделать тайл в майне, запустить сервер и оставить на N времени, а чтобы не повесить машину нафиг, сделать срабатывание раз в тик.
Осталась "мелочь" - написать саму функцию перебора. И с этим я обращаюсь к вам - помогите, люди добрые, иначе мой мозг взорвётся сильнее Хиросимы, Нагасаки и Мегатонны вместе взятых хд
Код:
public class DecryptorTileEntity extends TileEntity {
	
	public static final String possibleChars = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789 `~!@#$%^&*()-_=+|/+[]{}';:.,<>?\\\"";
	public boolean decrypt19 = false;
	public int[] curPoses = new int[25];
	public int nowIters = 19;
	
	public DecryptorTileEntity() {
		for (int i : curPoses) i = 0;
		//for (int i = 0; i < possibleChars.length(); i++) System.out.println(possibleChars.charAt(i));
	}
	
	@Override
	public void updateEntity() {
		
	}
	
	public void checkString(String string) {
		if (hash(string).equals("16E1BDFD1D6AE1A954C9C5E1B2D9099780F3E1724541F1F2F77310B769CFFBAC")) {
			System.out.println(string);
			this.worldObj.setBlock(xCoord, yCoord + 1, zCoord, Blocks.chest);
			((IInventory) worldObj.getTileEntity(xCoord, yCoord + 1, zCoord)).setInventorySlotContents(0, new ItemStack(Items.paper, 1, 0).setStackDisplayName(string));
		}
	}
	
	String hash(String str) {
		if(str != null)
			try {
				MessageDigest md = MessageDigest.getInstance("SHA-256");
				return new HexBinaryAdapter().marshal(md.digest(salt(str).getBytes()));
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			}
		return "";
	}

	// Might as well be called sugar given it's not secure at all :D
	String salt(String str) {
		str = str += "wowsuchsaltmuchsecurityverywow";
		SecureRandom rand = new SecureRandom(str.getBytes());
		int l = str.length();
		int steps = rand.nextInt(l);
		char[] chrs = str.toCharArray();
		for(int i = 0; i < steps; i++) {
			int indA = rand.nextInt(l);
			int indB;
			do {
				indB = rand.nextInt(l);
			} while(indB == indA);
			char c = (char) (chrs[indA] ^ chrs[indB]);
			chrs[indA] = c;
		}

		return String.copyValueOf(chrs);
	}
}
В общем, кого заинтересовал и если кому не сложно - помогите)
Всем хорошего настроения и удачного дня о/


P.S. Ах да, чуть не забыл - ходят слухи, что в строке 19 символов. Потому изначально я планировал пробежаться проползти именно по такому варианту хд
 
Надо эту идею продвинуть в более заселённое место)
 
Зачем это делать на сервере Minecraft? 0_o
 
Назад
Сверху