def decode(imagepath, keypath, outputpath): image = Image.open(imagepath) key_image = Image.open(keypath) delimeter = DELIMETER.encode() delimeter = lina.message_to_binary(delimeter) delimeter = "".join(delimeter) width, height = image.size k_width, k_height = key_image.size if width * height != k_width * k_height: raise DifferentSizeError("size is different") return data_binary = "" buf = "" for pixel_i in range(width * height): row = pixel_i // width col = pixel_i % width k_row = pixel_i // k_width k_col = pixel_i % k_width pixel = image.getpixel((col, row)) key_pixel = key_image.getpixel((k_col, k_row)) if image.mode == "RGBA": pixel = pixel[:3] rgb = [] for i in range(3): color = pixel[i] k_color = key_pixel[i] byte = lina.message_to_binary(color) k_byte = lina.message_to_binary(k_color) for j in range(8): if len(buf) == len(delimeter): buf = buf[1:len(delimeter)] if (byte[j] == "1" and k_byte[j] == "0") or (byte[j] == "0" and k_byte[j] == "1"): buf += "1" data_binary += "1" else: buf += "0" data_binary += "0" if buf == delimeter: image.close() write_data(lina.cut_bytes(lina.split(data_binary)), outputpath) return image.close() write_data(lina.cut_bytes(lina.split(data_binary)), outputpath)
def img_to_binary(imgpath, outputpath): image = Image.open(imgpath) width, height = image.size result_binary = "" for row in range(height): for col in range(width): pixel = image.getpixel((col, row)) if image.mode == "RGBA": pixel = pixel[:3] for i in range(3): color = pixel[i] byte = lina.message_to_binary(color) result_binary += byte output_file = open(outputpath, "wb") output_file.write(lina.split(result_binary)) output_file.close() image.close()
def reverse(dispersed_dir, output_file, original_size): filenames = os.listdir(dispersed_dir) filenames.sort() dispersed_data_list = [] for filename in filenames: f = open(dispersed_dir + "/" + filename, "rb") dispersed_data_list.append("".join(lina.message_to_binary(f.read()))) f.close() i = 0 result = "" while True: j = i % len(filenames) k = i // len(filenames) if i / 8 > original_size: break result += dispersed_data_list[j][k] i += 1 f = open(output_file, "wb") f.write(lina.split(result)) f.close()
def encode(secret_filepath, key_filepath, output_filepath): if os.path.getsize(secret_filepath) > os.path.getsize(key_filepath): raise SizeOverError("size over") return secret_file = open(secret_filepath, "rb") key_file = open(key_filepath, "rb") secret_data = secret_file.read() key_data = key_file.read() secret_file.close() key_file.close() secret_binary = "".join(lina.message_to_binary(secret_data)) key_binary = "".join(lina.message_to_binary(key_data)) result_binary = "" for i in range(len(secret_binary)): s_bit, k_bit = secret_binary[i], key_binary[i] r_bit = "0" if (s_bit == "1" and k_bit == "0") or (s_bit == "0" and k_bit == "1"): r_bit = "1" result_binary += r_bit result = lina.split(result_binary) result_file = open(output_filepath, "wb") result_file.write(result)
def disperse(filepath, output_dir): output_file_length = 8 if output_dir is None: output_dir = "./output" os.mkdir(output_dir) f = open(filepath, "rb") binary = "".join(lina.message_to_binary(f.read())) f.close() results = [] for i in range(output_file_length): results.append("") for b in range(len(binary)): bit = binary[b] bi = b % output_file_length results[bi] += bit for i in range(len(results)): results[i] += "0" * (8 - (len(results[i]) % 8)) for i in range(output_file_length): results[i] = lina.split(results[i]) f = open(output_dir + "/data-" + str(i).zfill(8), "wb") f.write(results[i]) f.close()