小编jaw*_*awr的帖子

实现Diffie-Hellman密钥交换时,预主密钥不匹配

我正在尝试将DHE_DSS实现到go的crypto/tls包中.不幸的是,我似乎无法使PreMasterSecret(Z)变得相同,我的基本工作流程是:

接收服务器密钥交换消息

  • 提取P,G,Ys
  • 使用提供的数字签名验证

准备客户端密钥交换消息

  • 创建客户端的Xc
  • 生成Yc(Yc = G ^ Xc%P)
  • 生成Z(Z = Ys ^ Xc%P)
  • 发回Yc,包装如下:
ckx := make([]byte, len(yC)+2)
ckx[0] = byte(len(Yc)>>8)
ckx[1] = byte(len(Yc))
copy(ckx[2:], yBytes)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用gnutls-serv进行调试时,两个PreMasterSecrets(Z)是不同的.我是否需要签署退回的Yc,或者以其他方式包装?我在RFC 5246中看不到任何建议.

< - 编辑 - >

以下是我的更改补丁:

https://08766345559465695203.googlegroups.com/attach/48587532c74b4348/crypto.patch?part=4&view=1&vt=ANaJVrHbwydqEZc3zjUWqQ5C8Q5zEkWXZLdL0w6JJG3HYntOlBurUTY7mc9xR9OTfE0bJxs4eeL5a5SGd2jj9eIfXcwJQgLvJchXOgkYKBBynbPfshY8kuQ

ssl cryptography go diffie-hellman

42
推荐指数
1
解决办法
1455
查看次数

Golang,使用AES和Base64加密字符串

我正在尝试加密数据库中的一些文本,以便在程序启动期间加载和解密.

我尝试了一些方法,包括第三方库https://github.com/richard-lyman/lithcrypt无济于事.使用以下方法加密/解密8/10项,但似乎在加密/解密中的某些点留下了一些填充残差.现在我的代码是这样的:

package client                                                                                                                                                                                              
import (                                                                                                                                                                                                    
    "encoding/base64"                                                                                                                                                                                       
    "crypto/aes"                                                                                                                                                                                            
    "crypto/cipher"                                                                                                                                                                                         
    "fmt"                                                                                                                                                                                                   
) 

var iv = []byte{34, 35, 35, 57, 68, 4, 35, 36, 7, 8, 35, 23, 35, 86, 35, 23}

func encodeBase64(b []byte) string {                                                                                                                                                                        
    return base64.StdEncoding.EncodeToString(b)                                                                                                                                                             
}                                                                                                                                                                                                           

func decodeBase64(s string) []byte {                                                                                                                                                                        
    data, err := base64.StdEncoding.DecodeString(s)                                                                                                                                                         
    if err != nil { panic(err) }                                                                                                                                                                            
    return data                                                                                                                                                                                             
}                                                                                                                                                                                                           

func Encrypt(key, text string) string {                                                                                                                                                                     
    block, err := aes.NewCipher([]byte(key))                                                                                                                                                                
    if err != nil { panic(err) }                                                                                                                                                                            
    plaintext := []byte(text)                                                                                                                                                                               
    cfb …
Run Code Online (Sandbox Code Playgroud)

encryption base64 aes go

33
推荐指数
2
解决办法
4万
查看次数

Perl中的NTLM授权

我正在尝试为用Perl(或者可能是XS模块)编写的Web服务器实现NTLM授权.我的理解是它应该以下列方式工作:

c -> s: GET
s -> c: 401, WWW-Authenticate: NTLM
c -> s: GET, Authorization: NTLM [Type1 Message]
s -> c: 401, WWW-Authenticate: NTLM [Type2 Message]
c -> s: GET, Authorization: NTLM [Type3 Message]

IF s.Check([Type3 Message]):
  s -> c: 200
ELSE:
  s -> c: 401
Run Code Online (Sandbox Code Playgroud)

为了生成Type3消息,我使用了Authen :: Perl :: NTLMAuthen :: NTLM :: HTTP,这两者似乎都可以完美地生成消息,但是,它们没有提供检查Type3消息的功能.

我的下一步是尝试使用Win32 :: IntAuth来验证NTLM令牌.是我遇到麻烦的地方,开发人员和搜索到的其他信息片段说这个模块应该能够验证NTLM二进制令牌.

该模块包含一些Win32 API调用,即AcquireCredntialsHandle,AcceptSecurityContext,CompleteAuthToken和ImpersonateSecurityContext.

不幸的是,我在AcceptSecurityContext上验证NTLM令牌的所有尝试都失败了,SEC_E_INVALID_TOKENSEC_E_INSUFFICIENT_MEMORY导致我建议我的NTLM令牌不正确.下面是一些代码片段,以帮助显示我的方法.

# other code
...
if (not …
Run Code Online (Sandbox Code Playgroud)

perl winapi ntlm sspi

6
推荐指数
1
解决办法
462
查看次数

标签 统计

go ×2

aes ×1

base64 ×1

cryptography ×1

diffie-hellman ×1

encryption ×1

ntlm ×1

perl ×1

ssl ×1

sspi ×1

winapi ×1