バックグラウンド
Bukkit プラグイン (Minecraft サーバー側) に取り組んでいます。プラグインを使用すると、プレイヤーは互いにメッセージをやり取りできます。私はウェブインターフェースにも取り組んでいます。「受信トレイ」を表示するには、まずゲーム内で設定できるパスワードでログインする必要があります。
このパスワードは生のままでは保存されず、Unicode 値の長い文字列に変換された後、断片に分割され、それぞれが 16 進数に変換されて別の文字列に追加されます。
Java バージョン
//This isn't the best method, I know, but it's still going to take a genius to crack it.
//The resulting number (before somewhat converted to hex) is really
//long, there isn't an easy way of knowing the sequence of characters.
//This conversion is much different than straight up converting to hex,
//as PHP has certain limitations
public static String encodePassword(String password) {
String longNumber = "";
for(int i = 0; i < password.length(); i++) {
longNumber += ((int) password.charAt(i));
}
//System.out.println("long = " + longNumber);
String result = "";
int splitLength = 5;
int iterations = longNumber.length() / splitLength;
if(longNumber.length() % splitLength > 0)
iterations++;
for(int i = 0; i < iterations; i++) {
//System.out.println(result);
int start = splitLength * i;
if(longNumber.length() - start <= splitLength) {
String sub = longNumber.substring(start);
result += Integer.toHexString(Integer.parseInt(sub));
continue;
}
String sub = longNumber.substring(start, start + splitLength);
result += Integer.toHexString(Integer.parseInt(sub));
}
return result;
}
PHP のバージョン
function encodePassword($pw){
$unicode = "";
for($i=0; $i<strlen($pw); $i++){
$char = $pw{$i};
$val = unicode_value($char);
$unicode = $unicode.$val;
}
$result = "";
$splitLength = 5;
$iterations = strlen($unicode) / $splitLength;
if(strlen($unicode) % $splitLength > 0)
$iterations++;
for($i = 0; $i < $iterations; $i++) {
$start = $splitLength * $i;
if(strlen($unicode) - $start <= $splitLength) {
$sub = substr($unicode, $start);
$result = $result.base_convert($sub, 10, 16);
continue;
}
$sub = substr($unicode, $start, $splitLength);
$result = $result.base_convert($sub, 10, 16);
}
return $result;
}
パスワード「partychat」(プラグインの名前、グループチャット機能もあります)を「エンコード」すると2c212c93ef23163a91bcc
、Javaで取得し、2c212c93ef23163a91bcc0
(末尾の0を除いて同じ)PHPで取得します。私が間違っていることはありますか?
注: これは常に発生するとは限りません。ほとんどの「エンコード」は正常に機能しますが、何らかの理由でこのケースが発生することがあります。