一个加密算法,请高手支招

一个加密算法,请高手支招

import sha
import base64

def encrypt(pwd, salt):
    bsalt = base64.b64decode(salt)
    bpwd= pwd.decode('utf8')
   
    ball = bsalt  + bpwd

    ep = sha.new(ball).digest()   
   
    return base64.b64encode(ep)

以上是一个加密算法,salt是一个base64编码的字符串,首先进行解码,然后要把密码转换成utf8编码,接着把密码加在盐的后面进行hash。
问题是执行到ball = bsalt  + bpwd时会自动进行编码转化,统一为unicode编码,而bsalt中有字节无法转换,抛出异常。

请问我该怎么处理,或者我这个思路就不对?请高手支招,谢谢了!

不好意思,我没有分了~~


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python                                                                        
#-*- encoding:utf-8 -*-                                                                       

import sha
import base64

slat=base64.b64encode("重口味的盐")
pwd="口令"

def encrypt(pwd, salt):
    bsalt = base64.b64decode(salt)
    bpwd= pwd.decode('utf8')

    ball = bsalt  + bpwd.encode('utf8')

    ep = sha.new(ball).digest()

    return base64.b64encode(ep)

print encrypt(pwd, slat)



QUOTE:
cM4AvxKfDBjTcx2vIQyZgJp3Sb8=

你 pwd 里原先是什么格式的,现在这样转有点多余。
不好意思,忘记说了个前提,密码明文必须转为双字节后在加到salt后面,这算法是asp.net membership的加密算法,已经有一部分用户密码使用这个算法加密了,所以python的实现即使程序能够正确执行也还不够,必须按照原算法实现。

把pwd进行decode然后在encode,好像什么也没做哦

这样调用:
print encrypt('111111', 'lOsxLBVLM1rz9jl/rdLdhQ==')

结果如果是:
0WUSbhDIJnai6BYP309b3uPe/ig=
就对了

谢谢!
不直接+操作,自己写一个函数完成+的内容
我也是这样想的,应该用类似c的memcpy,但找不到这方面的资料,lich_wang有具体的思路吗?
编码真是弄不懂。

[Copy to clipboard] [ - ]
CODE:
>>> x="您"
>>> y=x.decode('utf8')
>>> y
u'\u60a8'
>>> X='111111'
>>> Y=X.decode('utf8')
>>> Y
u'111111'
>>>

那个 u60a8 应该就是 "您" 的双字节表示了吧? 为什么 u'111111' 显示的不是双字节呢?

楼主能不能把 asp.net 的相应输入用 16 进制发上来?
我查了 '1' 的 unicode 表示为 0x0031,直接接上去

[Copy to clipboard] [ - ]
CODE:
slat='lOsxLBVLM1rz9jl/rdLdhQ=='
pwd='111111'

def encrypt(pwd, salt):
    bsalt = base64.b64decode(salt)
    bpwd= '\x00\x31'*6

    ball = bsalt + bpwd
    ep = sha.new(ball).digest()

    return base64.b64encode(ep)

print encrypt(pwd, slat)

但结果不对。不明白 asp 的输入格式。
多谢retuor!
我把在.net下调试的相关数据都发出来:


      // .net 加密实现过程
      internal string EncodePassword(string pass, int passwordFormat, string salt)
        {
            if (passwordFormat == 0) // MembershipPasswordFormat.Clear
                return pass;

            byte[] bIn = Encoding.Unicode.GetBytes(pass);
            byte[] bSalt = Convert.FromBase64String(salt);
            byte[] bAll = new byte[bSalt.Length + bIn.Length];
            byte[] bRet = null;

            Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
            Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
            if (passwordFormat == 1)
            { // MembershipPasswordFormat.Hashed
               // 执行这里,使用SHA1算法加密
                HashAlgorithm s = HashAlgorithm.Create( Membership.HashAlgorithmType );
                bRet = s.ComputeHash(bAll);
            } else
            {
                bRet = EncryptPassword( bAll );
            }

            return Convert.ToBase64String(bRet);
        }


参数:
pass
"111111"

salt
"lOsxLBVLM1rz9jl/rdLdhQ=="



变量值:

bIn
{维数:[12]}
    [0]: 49
    [1]: 0
    [2]: 49
    [3]: 0
    [4]: 49
    [5]: 0
    [6]: 49
    [7]: 0
    [8]: 49
    [9]: 0
    [10]: 49
    [11]: 0


bSalt
{维数:[16]}
    [0]: 148
    [1]: 235
    [2]: 49
    [3]: 44
    [4]: 21
    [5]: 75
    [6]: 51
    [7]: 90
    [8]: 243
    [9]: 246
    [10]: 57
    [11]: 127
    [12]: 173
    [13]: 210
    [14]: 221
    [15]: 133

bAll
{维数:[28]}
    [0]: 148
    [1]: 235
    [2]: 49
    [3]: 44
    [4]: 21
    [5]: 75
    [6]: 51
    [7]: 90
    [8]: 243
    [9]: 246
    [10]: 57
    [11]: 127
    [12]: 173
    [13]: 210
    [14]: 221
    [15]: 133
    [16]: 49
    [17]: 0
    [18]: 49
    [19]: 0
    [20]: 49
    [21]: 0
    [22]: 49
    [23]: 0
    [24]: 49
    [25]: 0
    [26]: 49
    [27]: 0



result:
"0WUSbhDIJnai6BYP309b3uPe/ig="