示例#1
0
def myhmac(hash_function, message, key):
    if (len(key) > 64):
        key = hash(key)
    if (len(key) < 64):
        key += (b'\x00' * (64 - len(key)))

    opad = raw_xor(b'\x5c' * 64, key)
    ipad = raw_xor(b'\x36' * 64, key)
    return (hash_function(opad + hexToRaw(hash_function(ipad + message))))
示例#2
0
def myhmac(hash_function, message, key):
    if len(key) > 64:
        key = hash(key)
    if len(key) < 64:
        key += b"\x00" * (64 - len(key))

    opad = raw_xor(b"\x5c" * 64, key)
    ipad = raw_xor(b"\x36" * 64, key)
    return hash_function(opad + hexToRaw(hash_function(ipad + message)))
示例#3
0
def myhmac(hash_function, message, key):
    if (len(key) > BLOCKSIZE):
        key = hash(key)
    if (len(key) < BLOCKSIZE):
        key += (b'\x00' * (BLOCKSIZE - len(key)))

    opad = raw_xor(b'\x5c' * BLOCKSIZE, key)
    ipad = raw_xor(b'\x36' * BLOCKSIZE, key)

    return hash_function(opad + hexToRaw(hash_function(ipad + message)))
def myhmac(hash_function, message, key):
    if (len(key) > BLOCKSIZE):
        key = hash(key)
    if (len(key) < BLOCKSIZE):
        key += (b'\x00' * (BLOCKSIZE - len(key)));

    opad = raw_xor(b'\x5c' * BLOCKSIZE, key);
    ipad = raw_xor(b'\x36' * BLOCKSIZE, key);
        
    return hash_function(opad + hexToRaw(hash_function(ipad + message)));
def myhmac(hash_function, message, key):
    blocksize = hash_function().block_size;
    if (len(key) > blocksize):
        key = hash_function(key).digest()
    if (len(key) < blocksize):
        key += (b'\x00' * (blocksize - len(key)));

    opad = raw_xor(b'\x5c' * blocksize, key);
    ipad = raw_xor(b'\x36' * blocksize, key);
    
    return hash_function(opad + hash_function(ipad + message).digest()).digest();
示例#6
0
def myhmac(hash_function, message, key):
    blocksize = hash_function().block_size
    if (len(key) > blocksize):
        key = hash_function(key).digest()
    if (len(key) < blocksize):
        key += (b'\x00' * (blocksize - len(key)))

    opad = raw_xor(b'\x5c' * blocksize, key)
    ipad = raw_xor(b'\x36' * blocksize, key)

    return hash_function(opad +
                         hash_function(ipad + message).digest()).digest()
示例#7
0
def recoverPlaintext():
    # start with the cipher
    originalCipher = cipher;
    # edit the plaintext to be all 0, recovering the raw keystream
    newPlain = b'\x00' * len(originalCipher);
    keystream = editAPI(originalCipher, 0, newPlain);
    # xor out the keystream from the original plaintext
    originalPlain = raw_xor(originalCipher, keystream);
    return originalPlain;
示例#8
0
def recoverPlaintext():
    # start with the cipher
    originalCipher = cipher
    # edit the plaintext to be all 0, recovering the raw keystream
    newPlain = b'\x00' * len(originalCipher)
    keystream = editAPI(originalCipher, 0, newPlain)
    # xor out the keystream from the original plaintext
    originalPlain = raw_xor(originalCipher, keystream)
    return originalPlain
def generateEncryptedAdminProfile():
    desiredComment = b';admin=true;';
    firstComment = b'\x00' * len(desiredComment);
    # encrypt my harmless plaintext
    firstEncProfile = encryptString(firstComment);
    # locate the encrypted version of my comment, extract encrypted form of comment
    offset = len(prefix);
    firstCipher = firstEncProfile[offset:offset+len(firstComment)];
    # make new profile
    newEncProfile = firstEncProfile[0:len(prefix)] + raw_xor(firstCipher, desiredComment) + firstEncProfile[len(prefix)+len(desiredComment):];
    return newEncProfile;
示例#10
0
def generateEncryptedAdminProfile():
    desiredComment = b';admin=true;';
    firstComment = b'\x00' * len(desiredComment);
    # encrypt my harmless plaintext
    firstEncProfile = encryptString(firstComment);
    # locate the encrypted version of my comment, extract encrypted form of comment
    offset = len(prefix);
    firstCipher = firstEncProfile[offset:offset+len(firstComment)];
    # make new profile
    newEncProfile = firstEncProfile[0:len(prefix)] + raw_xor(firstCipher, desiredComment) + firstEncProfile[len(prefix)+len(desiredComment):];
    return newEncProfile;
def solve20():
    keystream = b'';
    # for the 0th, 1st, 2nd byte...
    for i in range(shortestCipherLength):
        # combine those cipher bytes into one long keystream
        cipher = b''.join([tc[i].to_bytes(1, byteorder='big') for tc in truncatedCiphers]);
        maxMG = 0;
        maxKey = -1;
        # for each potential keystream byte
        for j in range(256):
            # try that byte as a keystream
            potentialPlain = raw_xor(cipher, j.to_bytes(1, byteorder='big')*len(cipher));
            mg = calculateMG(potentialPlain);
            if (mg > maxMG):
                maxMG = mg;
                maxKey = j;
        # assume highest-scoring key is right
        keystream += maxKey.to_bytes(1, byteorder='big');
    printSolution(keystream, truncatedCiphers);
示例#12
0
def recoverKey():
    # Use your code to encrypt a message that is at least 3 blocks long:
    #  AES-CBC(P_1, P_2, P_3) -> C_1, C_2, C_3
    plaintext = (b'A' * 48)
    cipher = aes_cbc_enc(plaintext, global_aes_key, global_iv)

    #Modify the message (you are now the attacker):
    #   C_1, C_2, C_3 -> C_1, 0, C_1
    modifiedCipher = cipher[0:16] + (b'\x00' * 16) + cipher[0:16]

    # Decrypt the message (you are now the receiver) and raise the
    # appropriate error if high-ASCII is found.
    (checkAsciiResult, errorString) = decryptAndCheckAscii(modifiedCipher)

    # As the attacker, recovering the plaintext from the error, extract the key:
    #  P'_1 XOR P'_3
    if (checkAsciiResult):
        raise Exception("Unlucky")
    key = raw_xor(errorString[0:16], errorString[32:48])
    return key
def recoverKey():
    # Use your code to encrypt a message that is at least 3 blocks long:
    #  AES-CBC(P_1, P_2, P_3) -> C_1, C_2, C_3
    plaintext = (b'A' * 48);
    cipher = aes_cbc_enc(plaintext, global_aes_key, global_iv);

    #Modify the message (you are now the attacker):
    #   C_1, C_2, C_3 -> C_1, 0, C_1
    modifiedCipher = cipher[0:16] + (b'\x00' * 16) + cipher[0:16];

    # Decrypt the message (you are now the receiver) and raise the
    # appropriate error if high-ASCII is found.
    (checkAsciiResult, errorString) = decryptAndCheckAscii(modifiedCipher);

    # As the attacker, recovering the plaintext from the error, extract the key:
    #  P'_1 XOR P'_3
    if (checkAsciiResult):
        raise Exception("Unlucky");
    key = raw_xor(errorString[0:16], errorString[32:48]);
    return key;
示例#14
0
def solve20():
    keystream = b''
    # for the 0th, 1st, 2nd byte...
    for i in range(shortestCipherLength):
        # combine those cipher bytes into one long keystream
        cipher = b''.join(
            [tc[i].to_bytes(1, byteorder='big') for tc in truncatedCiphers])
        maxMG = 0
        maxKey = -1
        # for each potential keystream byte
        for j in range(256):
            # try that byte as a keystream
            potentialPlain = raw_xor(
                cipher,
                j.to_bytes(1, byteorder='big') * len(cipher))
            mg = calculateMG(potentialPlain)
            if (mg > maxMG):
                maxMG = mg
                maxKey = j
        # assume highest-scoring key is right
        keystream += maxKey.to_bytes(1, byteorder='big')
    printSolution(keystream, truncatedCiphers)
示例#15
0
def printSolution(guess, ciphers):
    print("------------------------------")
    print("Guess: ", guess)
    for i in range(len(ciphers)):
        print("Plain ", i, ": ", raw_xor(ciphers[i], guess))
示例#16
0
def printSolution(guess, ciphers):
    print("------------------------------")
    print("Guess: ", guess)
    for i in range(len(ciphers)):
        print("Plain ", i, ": ", raw_xor(ciphers[i], guess))