免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7301 | 回复: 23
打印 上一主题 下一主题

一个加密算法,请高手支招 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-26 17:05 |只看该作者 |倒序浏览
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中有字节无法转换,抛出异常。

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

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

论坛徽章:
0
2 [报告]
发表于 2008-08-26 17:31 |只看该作者

  1. #!/usr/bin/env python                                                                        
  2. #-*- encoding:utf-8 -*-                                                                       

  3. import sha
  4. import base64

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

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

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

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

  12.     return base64.b64encode(ep)

  13. print encrypt(pwd, slat)
复制代码

cM4AvxKfDBjTcx2vIQyZgJp3Sb8=

论坛徽章:
0
3 [报告]
发表于 2008-08-26 17:37 |只看该作者
你 pwd 里原先是什么格式的,现在这样转有点多余。

论坛徽章:
0
4 [报告]
发表于 2008-08-26 17:40 |只看该作者
不好意思,忘记说了个前提,密码明文必须转为双字节后在加到salt后面,这算法是asp.net membership的加密算法,已经有一部分用户密码使用这个算法加密了,所以python的实现即使程序能够正确执行也还不够,必须按照原算法实现。

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

[ 本帖最后由 tearyrose 于 2008-8-26 17:42 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-08-26 17:41 |只看该作者

再补充一点

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

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

谢谢!

论坛徽章:
0
6 [报告]
发表于 2008-08-26 17:44 |只看该作者
不直接+操作,自己写一个函数完成+的内容

论坛徽章:
0
7 [报告]
发表于 2008-08-26 17:47 |只看该作者

回复 #6 lich_wang 的帖子

我也是这样想的,应该用类似c的memcpy,但找不到这方面的资料,lich_wang有具体的思路吗?

论坛徽章:
0
8 [报告]
发表于 2008-08-26 18:13 |只看该作者
编码真是弄不懂。


  1. >>> x="您"
  2. >>> y=x.decode('utf8')
  3. >>> y
  4. u'\u60a8'
  5. >>> X='111111'
  6. >>> Y=X.decode('utf8')
  7. >>> Y
  8. u'111111'
  9. >>>
复制代码


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

楼主能不能把 asp.net 的相应输入用 16 进制发上来?

论坛徽章:
0
9 [报告]
发表于 2008-08-26 18:22 |只看该作者
我查了 '1' 的 unicode 表示为 0x0031,直接接上去


  1. slat='lOsxLBVLM1rz9jl/rdLdhQ=='
  2. pwd='111111'

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

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

  8.     return base64.b64encode(ep)

  9. print encrypt(pwd, slat)
复制代码


但结果不对。不明白 asp 的输入格式。

论坛徽章:
0
10 [报告]
发表于 2008-08-26 18:31 |只看该作者
多谢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="
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP