私はユーザーから与えられた式を使ってユーザーの入力メッセージを暗号化しようとしているPythonプログラムを作成しようとしています。これは私の最初のプログラム( "hello world"と "number guesser"を除く)になります。私はより具体的にしようとします。私は最初に行うべきことは、リストを作成し、すべての手紙とその対応する数字を書くことだと思います。文字列の入力を求め、3x + 2のような方程式を書くように求める。私がしようとしていることは、文字列入力の各文字がリストから対応する数字を見つけ、式を使って別の出力を生成することです。私は暗号化されるメッセージを分割して各数値の値を見つけなければならないと思いますが、どのようにしてその数値を式に入れるのでしょうか?特定の関数を使用したPythonによる暗号化プログラム
0
A
答えて
0
for-loop内でchar-by-charを実行し、ord()を使用してascii文字の序数を取得することができます。算術式を評価するには、astを使用してください(Evaluating a mathematical expression in a string参照)。その前に、 "x"を以前に収集した序数で置き換える必要があります。
ここにはうまくいけば最小限の例があります。
用途:
$ python mycrypt.py "Stack Overflow is Awesome!" "3x+2"
:251:350:293:299:323:98:239:356:305:344:308:326:335:359:98:317:347:98:197:359:305:347:335:329:305:101:
コード:
#!/usr/bin/python
import sys
import ast
import operator as op
# supported operators
operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul,
ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor,
ast.USub: op.neg}
def eval_expr(expr):
"""
>>> eval_expr('2^6')
4
>>> eval_expr('2**6')
64
>>> eval_expr('1 + 2*3**(4^5)/(6 + -7)')
-5.0
"""
return eval_(ast.parse(expr, mode='eval').body)
def eval_(node):
if isinstance(node, ast.Num): # <number>
return node.n
elif isinstance(node, ast.BinOp): # <left> <operator> <right>
return operators[type(node.op)](eval_(node.left), eval_(node.right))
elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1
return operators[type(node.op)](eval_(node.operand))
else:
raise TypeError(node)
# Your first argument (e.g. "Stack Overflow is Awesome!")
text = sys.argv[1]
# Your second argument (e.g. "3x+2")
calc = sys.argv[2]
# Print beginning
sys.stdout.write(":")
# For each character in text do your calculation
for c in text:
# Generate expression by replacing x with ascii ordinal number
# prefixed with a multiplicator.
# -> character "a" has ordinal number "97"
# -> expression "3x+2" will be changed to "3*97+2"
# likewise the expression "3*x+2" will be changed to "3**97+2"
# which might not be the expected result.
expr = calc.replace("x", "*" + str(ord(c)))
# Evaluate expression
out = eval_expr(expr)
# Print cipher with trailing colon and without newline
sys.stdout.write(str(out) + ":")
# Print ending newline
print("")
+0
これはまさに私が探していたものです。私はこれを試し、あなたに知らせるでしょう。どうもありがとうございます! –
関連する問題
- 1. MD5を使用したPythonプログラムでのSQLログインの暗号化
- 2. pythonを使用したカラーコードによる暗号化
- 3. 特定のキーを使用したファイルの暗号化と復号化
- 4. Pythonによる暗号化
- 5. Pythonによる暗号化
- 6. ceasar暗号化を使用したOTP暗号化
- 7. CryptoJs暗号化とRijndaelManagedを使用したC#暗号化 - エラー
- 8. キーと暗号化を取得するためのpython関数
- 9. Vignere Pythonでプログラムを暗号化/復号化する
- 10. シーザー暗号暗号化Python
- 11. linuxを使用したAESによるファイル暗号化/復号化
- 12. Python - 既知の解読関数のJavascript暗号化関数
- 13. OpenSSLを使用したPythonでのRSA暗号化と復号化
- 14. PDF暗号化Pythonを使用
- 15. ハスケル暗号化プログラム
- 16. phpseclibを使用したPBEWITHSHAAND3-KEYTRIPLEDES-CBCによる暗号化
- 17. (LibreSSL)libcryptoを使用したAES-256-GCMによる暗号化
- 18. 標準ライブラリを使用したPythonでのプライベート/パブリック暗号化
- 19. PKCS7Paddingを使用したPythonとNode.jsのAES暗号化
- 20. トークン化エンジン|シードファイルを使用した暗号化復号化
- 21. 暗号化:C関数をPythonに変換する
- 22. Antアルゴリズムを使用した暗号化
- 23. Javaを使用したHDFS暗号化
- 24. phpseclibを使用したAES暗号化
- 25. MonoTouchを使用したAES暗号化
- 26. コマンドラインを使用したAES暗号化
- 27. パスワードを使用したWinForms暗号化
- 28. Javaを使用した暗号化
- 29. PHPを使用したC#暗号化の復号化
- 30. Springを使用したパスワードの暗号化/復号化
あなたが使用することができ、 'のeval()'(セキュリティ上の理由のために)それが好まれていない方法。あなたは 'ax^2 + bx + c'のような普遍的な関数を作成し、' a'、 'b'、' c'をユーザに尋ねるだけで 'def fun(a、b、c、x)を簡単に定義できます:return a * x ** 2 + b * x + c'となる。あるいは、シンボリックな数学のための[sympy](http://www.sympy.org/en/index.html)モジュールを試すこともできます。 – furas
@Emre例を挙げてください。この方法を助ける方がはるかに簡単です。 –
説明をありがとうございました!私は 'rednammoc'のやり方を理解していたと思う。 –