01/10/2018, 09:27

Thuận Toán Mã Hóa Dữ Liệu

Thằng bạn nhờ em nghĩ một cái thuật toán để mã hóa dữ liệu mà không ai decode được e bảo nó dùng hash nó không chịu thế rồi e viết ra cái này

function _encode($str)
{
	$str_en = ';

	$validChar = array('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
	'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm',
	'1', '2' ,'3', '4', '5', '6', '7', '8', '9', '0');

	for ($ch = 0; $ch < strlen($str); $ch++)
	{
		$char = $str[$ch];
		$value = unpack('H*', $char);
		$piece = substr(base_convert($value[1], 16, 2), 4);
		$encoded = ';
		for ($i = 0; $i < 2; $i++)
		{
			for ($j = 0; $j < 2; $j++)
			{
				for ($k = 0; $k < 2; $k++)
				{
					for ($l = 0; $l < 2; $l++)
					{
						$en = pack('H*', base_convert($i.$j.$k.$l.$piece, 2, 16));
						if (empty(array_search($en, $validChar)))
						{
							continue;
						}
						else if ($en == $char)
						{
							continue;
						}
						else
						{
							$encoded .= $en;
						}
					}	
				}	
			}
		}
		$str_en .= $encoded;
	}
	return $str_en;
}

và kết quả

Cách này là e lấy 3 kí tự của một kí tự input rồi hoán vị các kí tự 01 ở 4 vị trí đầu rồi rồi kiểm tra nếu nó không phải là kí tự lạ thì cho vào. Nhưng nó nói với e là vậy vẫn còn rất dài. Nên e mong các anh chị có kinh nghiệm cho e cái gợi ý nào đó.
E cám ơn ạ.

Trần Hoàn viết 11:44 ngày 01/10/2018

Vấn đề là yêu cầu của nó là gì. Tại sao nó không chịu.
Và nó muốn mã hoá công khai hay mã hoá bí mật.

Henry viết 11:28 ngày 01/10/2018

dạ mã hóa bí mật. vấn đề là muốn mã hóa dữ liệu để lưu database rồi có thể decode ra mà thuật toán lại phải ngắn nữa ạ

Trần Hoàn viết 11:32 ngày 01/10/2018

Thế thì em dùng luôn AES đi, chuẩn mã hoá quốc phòng của Mỹ :))

Henry viết 11:41 ngày 01/10/2018

trời nó dài hơn của e nữa

Trần Hoàn viết 11:28 ngày 01/10/2018

Ừa, phức tạp thì mới dài chứ sao. Không thì anh cho em một thuật toán mã hoá rất ngắn nhé, nhưng mà chắc là dễ bị phá lắm. Bài tập trên CodeFights chỉ mới dùng được cho bảng chữ cái lowercase trong ASCII. Anh sửa lại để dùng được với toàn bộ ASCII. (C#)

string Encode(string Input)
{
    var Sum = 0;
    var Output = "";
    foreach (var i in Input)
    {
        Output += (char)((i + Sum) % 128);
        Sum = (Sum + i) % 128;
    }
    return Output;
}
string Decode(string Input) 
{
    var Output = "" + Input[0];
    for (int i = 1; i < Input.Length; i += 1)
        Output += (char)((Input[i] + 128 - Input[i - 1]) % 128);
    return Output;
}

Em nếu em đùng Decode() để encode thì dùng Encode() để decode

Trần Hoàn viết 11:28 ngày 01/10/2018

Còn muốn chơi cả Unicode thì thay 128 thành 65536

*grab popcorn* viết 11:32 ngày 01/10/2018

Base64 với custom table thử xem, có hàm sẵn ráp cái bụp là xong :?
https://ideone.com/QBSgrr

Lúc này đòi hỏi phải có custom table mới decode được. Nhưng nếu ai quen dạng này rồi thì có thể tạo lại custom table

rogp10 viết 11:39 ngày 01/10/2018

Cái này để obfuscate chứ mã hóa gì chời :shrug:

(spoiler) code này chỉ lấy nibble thấp rồi ráp thêm nibble cao ở đâu đó vào cho thành alphanumeric. Sao không dùng thao tác bit ấy.

Mà không ai decode cũng đúng vì mất thông tin rồi còn đâu =)) mã hóa là việc nghiêm túc chứ không phải như chơi đồ hàng.

明玉 viết 11:30 ngày 01/10/2018

Thử implement mã hóa Enigma đi , đừng mắc sơ hở như phe px thì cực kì an toàn nhé

rogp10 viết 11:41 ngày 01/10/2018

Key space của Enigma từ 63 đến 71 bit thôi chưa kể cấu trúc nội tại của nó.

Bài liên quan
0