2017-08-26 18 views
0

私はPythonスクリプトをPowerShellに変換しようとしています。私はPythonスクリプトのループで何が起こっているのか理解していません。以下にPythonスクリプトの例を示します。PythonループをPowerShellに変換する

import time 

def obfuscateApiKey() : 
    seed = 'f1avad34567a' 
    now = str(long(time.time() * 1000)) 
    n = now[-6:] 
    r = str(int(n) >> 1).zfill(6) 
    key = "" 
    for i in range(0, len(n), 1): 
     key += seed[int(n[i])] 
    for j in range(0, len(r), 1): 
     key += seed[int(r[j])+2] 

    print "Timestamp:%s  Key:%s" % (now, key) 

obfuscateApiKey() 

これは、私はPowerShellの変換のために、これまでに作ってみたものですが、私は任意のPythonの経験を持っていないと、ループで行われているものを理解壁を直撃しています。

$seed = 'f1avad34567a' 
$Now = ([int](get-date -UFormat %s) *1000).ToString() 
$n = $now.Substring([math]::Max(0, $now.Length – 6)) 
$r = $n -shr 1 
$key = @() 

PowerShellでこの部分を行う方法についてのヒントはありますか?

for i in range(0, len(n), 1): 
    key += seed[int(n[i])] 
for j in range(0, len(r), 1): 
    key += seed[int(r[j])+2] 
+2

だけサイドノートとして、 '範囲(0、LEN(n)は、1)'だけ '範囲(LEN(N))であります'。 –

答えて

1

これはどのようにキーを難読化しますか?それはパラメータをとらず、現在の時間に依存するので、可逆的ではなく、反復不可能であるように見える。その唯一のものが「検証可能」であれば、つまり誰かが印刷されたタイムスタンプを読んだり、シードを知ったり、生成されたキーをチェックしたりすることができます。それが本当であれば、それを一度実行し、その機能を固定印刷ステートメント'Timestamp:1503715652844 Key:3da5aada53aa'に置き換えて永遠に有効にすることが非常に魅力的です。

オリジナル:

def obfuscateApiKey(): 
    seed = 'f1avad34567a'    # string 
    now = str(long(time.time() * 1000)) # current timestamp with 
             # milliseconds rolled in, as string 
    n = now[-6:]      # last 6 chars 
    r = str(int(n) >> 1).zfill(6)  # right bit shift 1 and 
             # left pad to len 6 with zeros 

    key = ""       # empty string 

    for i in range(0, len(n), 1):  # 0,1,2,3,4,5 (because n is len 6) 
     key += seed[int(n[i])]   # string index in n, lookup in seed 

    for j in range(0, len(r), 1):  # 0,1,2,3,4,5 again (?), r is len 6 
     key += seed[int(r[j])+2]  # string index in r, lookup in seed 

    print "Timestamp:%s  Key:%s" % (now, key) # print 

はPowerShellの:

$seed = 'f1avad34567a' 

# Bit of a mess, to handle get-date returning local time 
# but Unix timestamps needing to be in UTC timezone 
$now = [string][math]::Floor([double](Get-Date -Date (Get-Date).ToUniversalTime() -UFormat %s) * 1000) 

# Your substring line 
$n = $now.Substring([math]::Max(0, $now.Length–6)) 

# Your shift-right, but $n was a string, so convert to [int] 
# and PadLeft is the equivalent of zfill 
$r = "$([int]$n -shr 1)".PadLeft(6, '0') 

# string concatenation works in PS, for small uses it's fine. 
$key = '' 

# The loops and indexing almost translate. I've made them fixed 
# ranges because it seems the lengths of the strings are fixed. 
# The casting is awkward, but the result of looking up a character 
# from a string is type [char] and they cast to int as the 
# ascii/unicode codepoint value, not the numeric value of the content. 
0..5 | ForEach-Object { 
    $key += $seed[[int][string]$n[$_]] 
} 

0..5 | ForEach-Object { 
    $key += $seed[[int][string]$r[$_]+2] 
} 

'Timestamp:{0} Key:{1}' -f $now, $key 
+0

これは素晴らしい作品です。本当にありがとうございます。投稿が提出されると、タイムスタンプとキーが含まれます。彼らは種を知っている。タイムスタンプが2時間以上経過していれば、それは受け入れられません。 私は 'zfill'の使用についてはあまりよく分かりませんでした。 'n'が' now'から最後の6文字を取っている場合、 'zfill'の幅が6なので、元の文字列は常に返されませんか? – YEMyslf

関連する問題