• 締切済み

ビッグエンディアン環境で動作していたソフトウェア(暗号処理等を含む)を

ビッグエンディアン環境で動作していたソフトウェア(暗号処理等を含む)を急遽リトルエンディアンの環境へ移植することになりました(コンパイラ等もリトルエンディアン用)。 具体的には、SHA、RSA、DHなどのアルゴリズムを含み、入力データ(128Byte程度)に対する電子署名の生成や検証を行うソフトウェアです。 ここで、移植するために修正すべき箇所を特定したいのですが、どのようにすれば良いか教えていただけないでしょうか? (ビット演算や型変換なども多用しています) よろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

可能であれば, 「エンディアンを変換する」機能を作ってはさむのが一番簡単だと思う. ただし保証はしない. 本当に移植するんだとしたら, あきらめてすべてチェックするんだろうけど.... いちから作り直した方が早かったりして.

benizakura_1001
質問者

お礼

回答いただき、ありがとうございますm(__)m おっしゃるとおり、エンディアン変換が必要な個所にマクロ/関数をかませようと思っています。 ここで「必要な個所がどこか」が良く分からなくて。。。。 Byte型の変数や配列をByteのまま扱っているところは、基本的にそのままで良いと考えています。 それ以外の型の変数や配列なのですが、そのままの型で代入や演算等行っているところもそのままで良いと思っているのですが、間違いでしょうか? また、Byte以外の型の変数や配列(例えば、int型の配列N1[4])に対してキャストしつつ別のByte型配列の値(例えば、char型の配列N2[16])を代入するような場合、エンディアン変換が必要になると思うのですが、これも間違いでしょうか? 色々と書いてしまって申し訳ございませんが、ご教示いただけると助かります。

関連するQ&A

  • ビッグ/リトルエンディアンについて

    現在、ワークステーション(SPARC+Soralis)上でFortranで書かれたプログラムがあります。 それをPC(x86+WindowsXP)の環境へ移行した所、Fortran記録(バイナリ)の内容が、CPUアーキテクチャの絡みでビックエンディアン/リトルエンディアンの問題が発生し、苦労しています。 Windows側で使用しているFortranコンパイラは「富士通 Fortran&C Packege V4.0」です。 PC側でまともにワークステーションのバイナリファイルを読みたいのです。 どなたか対策をご存じの方がいらっしゃいましたら、ぜひ、ご教授ください。 よろしくお願いいたします。

  • freeSSHd設定について

    freeSSHd1.3.1をwindows2012R2条で使用しています。 セキュリティ監視部門から以下の内容で指摘が入り 設定を変更したいのですが、どの部分を変更して良いか分からず ここに投稿してみました。お判りになる方がいらっしゃればありがたいです。 <セキュリティ監視部門の指摘事項> 廃止される予定の暗号化設定は使用しないようにしてください。 現在、その設定は廃止される予定と思われます。 1.OFB の CFB を使用する暗号 CTR や GCM などの新しい暗号チェーンモードと比較すると脆弱であるため、非常に一般的ではなく廃止される予定です 2.RC4 暗号(arcfour、arcfour128、arcfour256) RC4 暗号は、暗号化バイアスを備えていますが、現在では安全であるとは考えられていません 3.ブロックサイズが 64 ビットの暗号(DES、3DES、Blowfish、IDEA、CAST) ブロックサイズが 64 ビットの暗号は誕生日攻撃に対して脆弱です(Sweet32) 4.DH グループ 1(diffie-hellman-group1-sha1、gss-group1-sha1-*)を使用する鍵交換のアルゴリズム DH グループ 1 は 1024 ビット長の鍵を使用しますが、それは短すぎて Logjam 型の攻撃に対して脆弱であると考えられています 5.鍵交換アルゴリズム‟ rsa1024sha1 ” RSA 鍵のサイズが短いために非常に一般的ではなく、廃止される予定です 6.MAC アルゴリズム‟ umac-32 ” MAC 長が非常に短いために非常に一般的ではなく、廃止される予定です 7.暗号化‟ なし ” これは SSHv1 でのみ利用可能で

  • 電子署名 RSAとDSA

    電子署名の一般的な説明のポンチ絵では以下のように説明されますが、これはRSAを用いた場合であり、DSAではないという理解で正しいでしょうか? ---- 送信者が文書のハッシュ値を秘密かぎで暗号化して電子署名を作成し、文書と電子署名と公開かぎ証明書を相手に送付する。 受信者は公開かぎ証明書を検証後、電子署名を復号化したものと、文書のハッシュ値を比較する。 ---- DSAは署名データをもとにもどせませんからね。

  • ディジタル署名方式について

    授業でディジタル署名方式について発表することになり、調べているのですが資料がなく困っています。 具体的には以下の「鍵生成・署名生成・検査」のアルゴリズムを調べています。 ・RSA署名方式 ・Rabin署名方式 ・改良Rabin署名 現在参考にしている資料は以下のものです。 「現代暗号の基礎数理」  電子情報通信学会 編  茨城大教授 工博 黒澤馨 著  東工大准教授 博士(工学) 尾形わかは 著 上記以外で役立ちそうな資料(著書、ホームページ等)がありましたら教えてください。 ちなみに、ネットワークセキュリティ全般に関しては素人なので、初心者にわかりやすいものが好ましいです。 また、ディジタル署名方式に詳しい方がおられましたらご教授していただけると幸いです。 よろしくお願いします。

  • パスワードの決め方について(SHA3orHMAC)

    パスワードの決め方や保管の方法について、分からなくなってきたので基本から質問させてください。 1.パスワードをホームページ等でネットに公開したら危険ですか? 2.1.はただそのまま公開したら危険なのでやってはいけないと思いますが、暗号化して、パスワードのパスワードがないと解けない状態にして公開しておけば安全ですか? 3.2.の暗号化の手法として、暗号学的ハッシュ関数を用いて、ハッシュ値 h をパスワードにすれば、暗号化したパスワードを公開しても安全ですか? 4.3.について、パスワードにしたハッシュ値 h を公開したのではパスワードをそのまま公開していることになり、危険なため、ハッシュ値 h を算出する暗号学的ハッシュ関数の実行コマンドをホームページ等で公開し、パスワードを確認したいときにはこのコマンドを実行してハッシュ値を得ることにすれば、安全ですか? 5.4.について、暗号学的ハッシュ関数はSHAシリーズなどがありますが、この実行コマンドは広く一般に利用できる状態で提供されているため(ハッシュ計算するソフトウェアやWebサイトなど)、SHAなど既存の暗号学的ハッシュ関数を用いるのではなく、自分で専用に暗号学的ハッシュ関数を考案し、また実行コマンドやソフトウェアを作成する必要がありますか? 6.5.が大変な場合、SHAなど既存の暗号学的ハッシュ関数を用いて4.を実現するにはどうしたらいいですか? 7.4.について、コマンドがパスワードの数だけ存在すると管理が大変です。コマンドは共通にして、オプションスイッチで区別することはできませんか? 8.7.について、コマンドは既存のソフトウェアをあらかじめインストールしておき、オプションスイッチを含む実行コマンド文のみをHP等で公開しておくことはできませんか? 9.6.7.8を実現するには、オプションスイッチのうちのひとつをパスワードのパスワードとして、このスイッチのみを非公開とすれば良いですか? 10.9.について、コマンド文はどのように記述すれば良いですか?たとえばハッシュ関数H()、出力h、パスワードの対となる文字列(IDとかファイル名等)m、パスワードのパスワードをk、||は結合とした場合、 H(k||m)=h と書けると思いますがこれをH(m)として公開し、kはあらかじめPC等コマンドを実行する環境で設定しておけば良いですか? 11.10について、暗号学的ハッシュ関数SHA2シリーズ(256bit等)を用いた場合、Merkle-Damgård 構造であるため、length-extension 攻撃され、危険ですか? 12.10.11.について、暗号学的ハッシュ関数SHA3シリーズを用いた場合、SHA2シリーズのハッシュ関数と異なりスポンジ構造であるため、length-extension 攻撃は成り立たず、安全ですか? 13.12について、length-extension 攻撃以外の危険性はありますか?

  • Apache HTTP Serverプラグインのコンフィグレーションでエラーが発生する

    【環境】 linux5.1 Apache2.2.3 WebLogic8.1 Apache HTTPサーバから WebLogic Serverへリクエストをプロキシするための環境構築をしています。 下記URLを参考に環境構築していますが、最後のhttpd.confファイルの検証のところでエラーが示され、解決できません。 http://otndnld.oracle.co.jp/document/products/wls/docs92/plugins/apache.html エラー内容は、「libCrun.so.1 : ELF file data encoding not little-endian」です。 libCrun.so.1は、usr/libに配置しています。 ※mod_wl_22.soはmodulesに配置しています。 多数のサイトを見ていろいろ試してみてはいますが、一向に解決できません。 もしこのエラーについてご存じの方がいらっしゃいましたら、ご教授願います。

  • qsort のアルゴリズムについて

    現在Solaris上で作られたソフトウェアをwindowsに乗せ換えるポーティング作業を 行っているのですが、qsortの結果が一致せずに困っています。 比較関数で判定できる範囲は一致するのですが、比較関数が一致するデータ同士の順番が 一致せず、その結果出力される生成物の内容が異なってしまいます。 (同じ生成物が作成されなければポーティング作業完了と成りません) 多分qsortのアルゴリズムの違いだと思うのですが、Solarisのqsortのアルゴリズムがわかる方 いらっしゃいませんか? Solarisのコンパイラは以下の通り Sun WorkShop Compiler Csparc 5.0 出来ればqsortのソースコードが有ればよいのですが、軸要素の決定方法だけでも解れば 幸いです。 いくつか、公開されているアルゴリズムを試してみたのですが、一致する物は有りませんでした。 (Windowsのソート結果とも違いました) 因みに、Windowsの開発環境は、 Microsoft Visual Studio 10.0 です。

  • ソフトウェア・シンセサイザー 動作環境について

    宜しくお願い致します。 KeyStudio 49iとM-TRON PROを購入検討しているのですが、 http://www.m-audio.jp/products/jp_jp/KeyStudio49i.html ↑KeyStudio 49i http://www.m-audio.jp/products/jp_jp/GForceMTronPro.html ↑M-TRON PRO 当方シンセサイザーは全くの素人でして動作するか否かが調べてもよくわかりませんでした。 PCの推奨動作環境は満たしているとして、KeyStudio 49iとM-TRON PROを購入すれば他の周辺機器なしでM-TRON PROは動作してくれるのでしょうか? 宜しくお願い致します。

  • リトルエンディアン、ビッグエンディアンについて

    リトルエンディアン、ビッグエンディアンについて 質問があります。 (1)簡単にそのPCがリトルエンディアンなのか、ビッグエンディアン  なのか、分かる方法はありますか?  簡単なCプログラムを書いてメモリ状態をダンプするのが、  一番早いのでしょうか?  それとも、Intel系?モントローラ系?CPUにはあまり詳しくないので、  分かりませんが、これらのどちらかに属していれば決められるので  しょうか?ほかの系とかあるのかな・・・ (2)ネットワークプログラミングをするときに、ビッグエンディアンの  マシンからデータを送出する場合には、htonlなどの関数を使用しなく  ても問題ありませんでしょうか?(ネットワークバイトオーダが  ビックエンディアンであるため)

  • エンディアンについて

    すみません。 教えてください。 リトルエンディアンからビッグエンディアンに変換しないと いけません。 エンディアンについては勉強したつもりですが、 どうしてもわからないことがあります。 ご存知の方、教えていただせんか? CPUはリトルです。 まず、エンディアンの違いについては 以下のように認識しています。 x = 0xAABBCCDD メモリの配置方法が、 トリルだと DD CC BB AA ビックだと AA BB CC DD だと思っています。32ビットの場合です。 で、これを変換するには、htonlで変換可能だと思っっています。 (試したところ可能でした) で次に、32ビットを超えるデータ、たとえば100バイトとかを mallocにして変数に代入しました。 この時はエンディアン変換(ファイルに出力する際)は必要ないのでしょうか? 試しに出力すると、 x = 0x AA BB CC DD EE FF GG ・・・・・・ZZ (100バイトと仮定) バイナリでの出力結果は AA BB CC DD EE FF GG ・・・・・となっていました。 私の認識だと、本CPUはリトルエンディアンのため、 ZZ ・・・・・・・・ DD CC BB AA (四バイトずつ反転しているデータ) が出力されるものと思っていました。(反転してメモリに格納されるため) リトル/ビックを意識しないといけないのは、 2バイトや4バイトの時のみで、それを超える大きなデータ(100バイト)などは 意識せず、そのままバイナリ出力しても、ビックエンディアンで出力されると いうことでよろしいでしょうか? そうなると、エンディアンってなんだんだ???と混乱しています。 わかりにくい説明で大変申し訳ござませんが、 よろしくお願いいたします。