質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

191閲覧

暗号化ストリームのエラーが解決できない

Riehlvelt_love

総合スコア43

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2024/03/15 04:39

編集2024/03/15 05:10

実現したいこと

前提

java初心者で参考書を読みながら暗号化ストリームの勉強をしていますがエラーが解決できません。

発生している問題・エラーメッセージ

型 Cipher のメソッド getInstance(String) は引数 () に適用できません - 行ブレークポイント:List [行: 17] - main(String[]) - The resource type Cipher does not implement java.lang.AutoCloseable - トークンに構文エラーがあります。これらのトークンを削除してください Cipherの定義がされていません

該当のソースコード

java

1package music; 2 3import java.io.*; 4 5import javax.crypto.CipherOutputStream; 6import javax.crypto.Cipher; 7import javax.crypto.CipherOutputStream; 8 9 10 11public class List { 12 13 public static void main(String[] args){ 14 15 try ( 16 FileOutputStream file = new FileOutputStream("rpgsave.dat"); 17// エラーになる 18 Cipher algo = Cipher.getInstance(“AES”); 19// エラーになる 20 CipherOutputStream cos=new CipherOutputStream(file,algo); 21 22 ){ 23 24 cos.write(65); 25 } catch (Exception e) { 26 // TODO 自動生成された catch ブロック 27 e.printStackTrace(); 28 } 29 30 31 } 32 33}

試したこと

下記などを読みCipherOutputStreamをnewする前にCipherをnewしなければいけないと思ったため同じように遣りましたがなぜエラーになるのかが分かりません。
https://support.google.com/faqs/answer/10046138?hl=ja
https://nompor.com/2017/11/28/post-1449/

修正後(deka様の回答後)

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

入力ミスですかね?AESを囲っているダブルコートの部分の。

java

1Cipher algo = Cipher.getInstance(“AES”);

java

1Cipher algo = Cipher.getInstance("AES");

投稿2024/03/15 04:57

deka

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Riehlvelt_love

2024/03/15 05:07

ありがとうございます。Cipher algo = Cipher.getInstance("AES");に改善しましたが、下記のようにまだ例外が出てしまいます。 Exception in thread "main" java.lang.Error: Unresolved compilation problems: The resource type Cipher does not implement java.lang.AutoCloseable 型 Cipher のメソッド getInstance(String) は引数 () に適用できません トークンに構文エラーがあります。これらのトークンを削除してください コンストラクター CipherOutputStream(FileOutputStream, Cipher) は未定義です at music.List.main(List.java:17)
deka

2024/03/15 05:28

try catch の書き方もなんかおかしいですね。 書き直してみてください。 try {  なんらかの処理 } catch (Exception e) { }
Riehlvelt_love

2024/03/15 05:39 編集

ありがとうございます。try-with-resources文で書いたつもりでしたが、何か間違っていたでしょうか? 下記のように書きなおすとエラーは消えました。しかし次のような例外になってしまいます。 「java.lang.IllegalStateException: Cipher not initialized at java.base/javax.crypto.Cipher.checkCipherState(Cipher.java:1826) at java.base/javax.crypto.Cipher.update(Cipher.java:1896) at java.base/javax.crypto.CipherOutputStream.write(CipherOutputStream.java:160) at music.List.main(List.java:18)」 という例外になってしまいます。 try { FileOutputStream file = new FileOutputStream("rpgsave.dat"); Cipher algo = Cipher.getInstance("AES"); CipherOutputStream cos=new CipherOutputStream(file,algo); cos.write(65); } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); }
deka

2024/03/15 05:57

Cipher not initialized と出たのではないでしょうか? 初期化も必要なのだと思います。 ご提示いただいているサイト https://nompor.com/2017/11/28/post-1449/ を真似て書いたら出来るのではないかと思います。 AutoCloseableインターフェースというインターフェースを実装しているクラスのみ try-with-resources構文が使えるそうなので、エラーとなったのだと思います。
Riehlvelt_love

2024/03/15 06:41

回答ありがとうございます。 試したところ↓問題が解決しました! ベストアンサーに選ばせていただきました。 String key = "angoukeymojiretu";//暗号キー文字列128bit String algorithm = "AES"; try{ FileOutputStream file = new FileOutputStream("rpgsave.dat"); Cipher c = Cipher.getInstance(algorithm); c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), algorithm));//暗号化モードで初期化 CipherOutputStream cos=new CipherOutputStream(file,c); cos.write(65); System.out.print("成功"); }catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); }
jimbe

2024/03/15 20:36 編集

try-with-resources を使わないなら、finally で close する等した方が良いと思います。 もしくは、 close が必要なのは FileOutputStream と CipherOutputStream でどちらも AutoClosable ですので、先に Cipher を生成・初期化した後に FileOutputStream と CipherOutputStream を生成するという順にすれば try-with-resources を使えます。 try { Cipher c = Cipher.getInstance(algorithm); c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), algorithm));//暗号化モードで初期化 try (FileOutputStream file = new FileOutputStream("rpgsave.dat"); CipherOutputStream cos = new CipherOutputStream(file,c);) { cos.write(65); System.out.print("成功"); } } catch (Exception e) { e.printStackTrace(); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問