IRC河豚加密模式?

时间:2012-04-24 17:52:51

标签: actionscript-3 irc blowfish

我一直在使用此工具进行一些测试:http://crypto.hurlant.com/demo/CryptoDemo.swf 并试图匹配从Mirc +河豚鱼(从以前的鱼.secure.us v1.30)获得的河豚结果。我不能为我的生活找到它正在使用的模式...没有什么匹配..有谁知道它使用什么模式?

3 个答案:

答案 0 :(得分:1)

IRC的Blowfish插件似乎使用了MODE_ECB(电子密码本),这可能是河豚算法中最不安全的。

对于加密,他们将明文分成8个字节的块(Blowfish ECB blockize)。然后,它们分别对每个8字节块进行加密,并获取每个加密块的输出,并将其分成(2)4字节长,并将base64encode每个长,将它们填充为6个base64字符的长度。

对于解密,这个过程是相反的,但因为它有些混乱,我也会描述。取12个密文字节,将每个6字节表示解码为long('> L'),这样你现在就有8个字节,然后将其传递给blowfish解密算法。

import struct, string
from Crypto.Cipher import Blowfish

def blow(key, plaintext):
    if not isinstance(plaintext, str):
        raise TypeError('Plaintext must be str')
    else:
        if len(plaintext) % 8 != 0:
            plaintext += "\0" * (8-(len(plaintext)%8))

        cipher = Blowfish.new(key, Blowfish.MODE_ECB)

        ciphertext = ''
        charset = list('./' + string.digits + string.ascii_lowercase + string.ascii_uppercase)
        for j in range(0,len(plaintext),8):
            block = cipher.encrypt(plaintext[j:j+8])
            (low, high) = struct.unpack('>LL', block)

            while high:
                ciphertext += charset[high%64]
                high //= 64
            if len(ciphertext) % 6 != 0:
                ciphertext += charset[0] * (6-len(ciphertext)%6)

            while low:
                ciphertext += charset[low%64]
                low //= 64
            if len(ciphertext) % 6 != 0:
                ciphertext += charset[0] * (6-len(ciphertext)%6)

        assert len(ciphertext) % 12 == 0
        return ciphertext

def unblow(key, ciphertext):
    if not isinstance(ciphertext, str):
        raise TypeError('Ciphertext must be str')
    else:
        assert len(ciphertext) % 12 == 0
        cipher = Blowfish.new(key, Blowfish.MODE_ECB)
        plaintext = bytearray()

        charset = list('./' + string.digits + string.ascii_lowercase + string.ascii_uppercase)
        for j in range(0,len(ciphertext),12):
            high = 0
            for k in range(6):
                high |= charset.index(ciphertext[j+k]) << (k*6)
            low = 0
            for k in range(6):
                low |= charset.index(ciphertext[j+k+6]) << (k*6)
            plaintext += cipher.decrypt(struct.pack('>LL', low, high))

        return plaintext.decode('utf8').rstrip("\0")

答案 1 :(得分:0)

它只使用ECB模式,但base64编码以奇怪的方式完成 - 每个32位密文块被独立编码为6个base64字符。

答案 2 :(得分:-1)

IRC不支持任何加密模式,除非您使用SSL,否则所有内容都将以纯文本格式传输。 Blowfish是一种加密算法,它将翻译您的消息(在mIRC上)或您正在使用的任何客户端。

没有blowfish消息将被发送到服务器:

PRIVMSG #Channel :YourMessage

将blowfish消息作为以下内容发送到服务器:

PRIVMSG #Channel :w8e09w8e09q8eqiwoqweqweqweqwueqwehwqheqywgBlowFishEncryption