[PYTHON] Crypter faussement l'image lors de la compression

Qu'est-ce que c'est ça

Un gars qui calcule le bruit sur la base d'un code prédéterminé et le met dans l'image. Décryptable.

table des matières

  1. Chiffrement
  2. Décryptage
  3. Obtenez le code appliqué 4, post-scriptum

chiffrement

Décidez du code de la chaîne de caractères et calculez le code ascii. Calculez le nombre de lignes et le reste de la longueur de chiffrement pour chaque ligne de l'image pour obtenir la valeur du bruit. Ajoute du bruit à tous les pixels de la ligne.

Par exemple, mon code est "ore mo waru katta" (j'étais aussi mauvais) → _ →. Le code ascii est [111, 114, 101, 95, 109, 111, 95, 119, 97, 114, 117, 95, 107, 97, 116, 116, 97]. gmag.jpg ↑ J'ajouterai du bruit à ça

encode.py


def encode(x,key):
    return ((255,x+key) if x+key<=255 else (0,x-255+key))

↑ Avec cela, la valeur du bruit à mettre dans le pixel est calculée. Ajoutez du bruit à la valeur du pixel, soustrayez 255 si elle dépasse 255 et renvoyez 0 et le résultat du calcul. S'il ne dépasse pas 1, renvoie 1 et le résultat. Je suis désolé que ce soit trop simple. .. .. Alors, pour l'image entière, faites ceci.

encode_img.py


def encode_image(img):
    ori_img = plt.imread(img)
    encode_img = np.array(ori_img,dtype='uint8')
    with open('{}_code.txt'.format(img[:-4]),'w') as f:
        for sub_array in encode_img[:,:,-1]:
            f.write(str(list(sub_array)).replace('[','').replace(']','')+',')
    f.close()
    for x in range(encode_img.shape[0]):
        for y in encode_img[x]:
            y[-1] == 255
            key = password[x%len(password)]
            y[-1],y[1] = (encode(y[1],key))
    img_name = 'encode_'+img[:-4]+'.png'
    plt.imshow(encode_img)
    print(img_name)
    plt.imsave(img_name,encode_img)

Le bruit est ajouté au deuxième canal du pixel, et le quatrième canal est utilisé comme un "drapeau pour soustraire" 255 ". En le mettant à 0 s'il est soustrait et à 1 s'il n'est pas soustrait, il est décidé s'il faut ajouter 255 en fonction de la valeur du 4ème canal lors du décodage. (Au fait, cette méthode semble stupide ...) (Puisque je dois connaître le 4ème canal de l'image originale pour un décodage parfait, je l'ai sauvegardé en txt ...) (Ça devient plus un idiot ...) Quand! Après le cryptage, l'image précédente ressemble à ceci! ↓ gmag.png D'accord, vous ne pouvez plus l'utiliser!

Décryptage

Soustrayez la valeur ajoutée au 2ème canal et copiez le 4ème canal de l'image originale directement sur le 4ème canal ... (Cela semble vraiment stupide ici) Au fait, le 4ème canal de l'image originale est'Image name_code Je l'ai sauvegardé en .txt '.

decode.py


def decode(x,flag,key):
    return (x-key if flag==255 else x+255-key)

↑ Au fait, ce drapeau est la valeur numérique du 4ème canal. Donc, ici, demandez à l'autre partie de saisir le code et d'utiliser le code ascii d'entrée comme clé de déchiffrement. En d'autres termes, vous ne pouvez pas décrypter correctement si vous n'entrez pas le bon code.

decode_img.py


def test(input_):
    for file in os.listdir():
        if file.endswith('.png'):
            encode_img = plt.imread(file)
            encode_img = np.array(encode_img*255,dtype='uint8')
            img = copy.deepcopy(encode_img)
            with open (file[:-4]+'_code.txt','r') as f:
                txt = f.read()
            f.close()
            code_array = np.fromstring(txt, dtype=int, sep=',')
            code_array = code_array.reshape(encode_img.shape[:2])
            input_password = []
            for i in str(input_):
                input_password.append(ord(str(i)))
            print('password:',input_password)
            for x in range(img.shape[0]):
                for y in img[x]:
                    key = input_password[x%len(input_password)]
                    y[1] = decode(y[1],y[-1],key)
            img[:,:,-1] = code_array
            plt.imsave('result/{}.jpg'.format(file[:-4]+input_),img)
            print('result saved as /result/{}.jpg'.format(file[:-4]+input_))

if __name__=='__main__':
    test(input('please input the password:\n'))

Ainsi, par exemple, si vous entrez "'onigunsou'" (guerrier démon) gmagonigunsou.jpg J'ai fait ça! Et si j'entre "'ore mo waru katta'"? gmagore mo waru katta.jpg bien joué.

Obtenez le code appliqué

Le reste est facile.

guess_password.py


password = [111, 114, 101, 95, 109, 111, 95, 119, 97, 114, 117, 95, 107, 97, 116, 116, 97]
init = '---_--_----_-----'

def guess_password(ate):
    guess = input('please guess the password\n')
    for i in guess:
        if ord(i) in password and  i not in ate:
            ate.append(i)
    print(ate)
    result = ''
    for  j in range(len(password)):
        result +=(chr(password[j]) if chr(password[j]) in ate else init[j])
    print(result)
    return result

def start():
    init = '---_--_----_-----'
    ate = ['_']
    result = guess_password(ate)
    while not all(chr(k) in ate for k in password):
        result = guess_password(ate)
    print('Félicitations! Le mot de passe est{}vous savez.\n J'étais aussi mauvais.'.format(result))

if __name__ == '__main__':
    start()

Et demandez-leur de deviner le code. Au fait, ça ressemble à ça. スクリーンショット 2020-01-16 17.18.04.png Vous pouvez le résoudre en entrant toutes les lettres anglaises en raison de la violence ... C'est un système cryptographique qui est gentil avec l'autre partie, n'est-ce pas?

Postscript

S-kun m'a demandé de créer un graphique, mais le lendemain, je me suis battu. Bien sûr, j'étais mauvais, mais mon adversaire était aussi un guerrier démon. .. .. Pour être honnête, j'étais un peu en colère et je ne voulais pas l'envoyer. mais! Même si vous dites que vous êtes seul, vous ferez ce que vous devez faire. Si vous ne le faites pas, vous deviendrez une personne sans sens des responsabilités. J'ai pensé, j'ai envoyé l'un des graphiques que j'ai fait, j'ai admis ma faute et j'ai dit: "Je suis désolé. Je suis désolé." Cependant, la réponse de l'autre partie était en retard, et il a écrit avec fierté: «Veuillez m'en donner une autre.

Je ne pense pas que quiconque l'utilisera, alors j'ai écrit le code modérément. Eh bien, c'était une pratique de programmation et c'était amusant! J'ai l'impression d'avoir utilisé toute la sagesse de ma vie ...

Recommended Posts

Crypter faussement l'image lors de la compression
Comportement lorsque Container Trainable = False dans Keras
Liste des images Docker personnalisées
Placement optimal de plusieurs images
Accélérer le chargement des images Python